Java網絡通信中URL與HTTP編程技術詳解
一. URL簡介
要想搞清楚URL編程,我們得先來看看什么是URL,所以先來給大家介紹一下URL的概念。
1. 概念
URL(Uniform Resource Locator,統(tǒng)一資源定位符) ,主要用于標識和定位互聯網上的資源,例如網頁、圖片、音頻、視頻等。通過URL,我們可以向服務器發(fā)送請求,獲取需要的資源。
2. 組成
一個URL可以由多個部分組成,包括協議、主機名、路徑和查詢參數等。常見的URL格式如下所示:
#基本組成 protocol://host:port/path?query #例如 http://www.qfedu.com:80/login.html?username=syc
其中,各部分含義如下所示:
- protocol:協議部分,可以是HTTP、FTP等;
- host:主機名或IP地址,例如 www.mobiletrain.org;
- port:端口號,例如80、8080等;
- path:路徑,用于標識具體的資源位置,例如/index.html;
- query:查詢參數,用于傳遞具體的參數給服務器,例如?key1=value1&key2=value2。
了解了URL的含義之后,我們就可以開始進行URL編程了。
二. URL編程
1. 簡介
URL編程也是Java中用于訪問互聯網資源的一種標準化方式。通過URL編程,我們可以基于HTTP、FTP等協議,方便地獲取網頁、圖片、音頻、視頻等資源。
另外我們也可以通過URL編程中的URLConnection、HttpURLConnection等類,向Web服務器或HTTP服務器發(fā)送請求,來建立與Web或HTTP服務器的連接,發(fā)送GET或POST請求,并讀取服務器返回的響應信息。
接下來給大家分別介紹一下URL、URLConnection等與URL編程相關的核心類。
2. URL類
要實現URL編程,首先我們得使用java.net.URL類來創(chuàng)建一個URL對象,然后使用該對象來獲取指定資源的輸入流。
URL類給我們提供了多個構造方法,其中最常用的是使用URL字符串來創(chuàng)建URL對象。例如,以下代碼就是通過URL字符串來創(chuàng)建一個URL對象:
URL url = new URL("<www.mobiletrain.org>");
利用這個URL對象,我們可以進一步使用openStream()方法來獲取指定資源的輸入流。例如,以下代碼就獲取了指定資源的輸入流:
InputStream input = url.openStream();
在實際應用中,我們可以使用BufferedReader等類來處理輸入流。
3. URLConnection類
3.1 簡介
Java.net.URLConnection是負責與HTTP服務器建立連接的通用類,它給我們提供了一些方法可以向服務器發(fā)送請求并讀取服務器的響應。比如,setRequestProperty()方法可以用于設置請求頭信息,setDoOutput()方法可以用于指示是否向服務器發(fā)送請求體等。另外URLConnection還是HttpURLConnection的父類,但與之不同的是,URLConnection還額外支持FTP、Gopher等協議。
從實現原理上來說,URLConnection類主要是通過創(chuàng)建一個連接對象,然后使用這個連接對象向服務器發(fā)送請求并讀取服務器的響應。而在創(chuàng)建連接對象時, URLConnection會根據指定的URL自動選擇合適的網絡協議。在連接對象創(chuàng)建成功后,我們可以使用connect()方法連接到服務器。當連接成功后,我們就可以使用getInputStream()方法來獲取服務器返回的輸入流,然后使用這個輸入流讀取服務器的響應結果。
3.2 基本使用
接下來再給大家介紹一下URLConnection類的基本使用步驟。URLConnection的使用,整體可以分為發(fā)起請求和獲取響應兩個步驟,所以接下來我也是按這種思路給大家進行介紹。
我們首先得創(chuàng)建一個URLConnection對象,代碼如下:
//大家可以選擇一個合適的url網址
URL url = new URL("<www.mobiletrain.org>");
//獲取連接對象
URLConnection conn = url.openConnection();
獲取了URLConnection對象之后,我們就可以向服務器發(fā)起請求了,代碼如下:
//指示是否向服務器發(fā)送請求體
conn.setDoOutput(true);
//通過輸出流,向服務器發(fā)送請求參數或請求體
OutputStreamWriter writer = new OutputStreamWriter(conn.getOutputStream());
writer.write("param1=value1¶m2=value2");
writer.flush();
writer.close();
在向服務器發(fā)送了請求之后,如果我們想得到服務器返回來的響應信息,可以使用如下方法:
//獲得服務器返回的響應流 InputStream input = conn.getInputStream();
然后我們就可以對這個響應流進行操作,得到具體的內容,例如下面的代碼:
BufferedReader reader = new BufferedReader(new InputStreamReader(input));
String line = null;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
當然,服務器返回來的信息不一定就是文本信息,也有可能是音頻、視頻、文件等內容,此時如果使用字符流就不合適了。我們也可以把InputStream轉換為字節(jié)流進行操作,通過字節(jié)得到合適的文件格式。
二. HTTP編程
其實HTTP編程與URL編程非常類似,兩者的使用基本一致,也是要通過java.net包中的API來實現,比如URL類和HttpURLConnection、HttpClient等類。其中URL類我們已經在前面講解過,接下來我們再了解一下HttpURLConnection類和HttpClient類的相關內容吧。
1. HttpURLConnection類
1.1 簡介
HttpURLConnection繼承自URLConnection類,該類也是用于與HTTP服務器建立連接的類。它提供了一些方法,可以讓我們來發(fā)送HTTP請求并讀取服務器的響應。
我們知道,URLConnection類是所有URL協議的通用父類,它提供了一些通用的方法來建立與服務器的連接,發(fā)送請求并讀取服務器的響應。但如果我們想要更多的HTTP功能,就可以使用HttpURLConnection類,否則可以使用URLConnection類。
1.2 基本使用
接下來也把HttpURLConnection的使用步驟給大家展示一下。
如果我們要使用HttpURLConnection,首先得創(chuàng)建一個URL對象,然后調用該對象的openConnection()方法來強制轉換得到一個HttpURLConnection對象。代碼示例如下:
URL url = new URL("<www.mobiletrain.org>");
//強制類型轉換
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
在得到連接對象之后,我們就可以發(fā)送HTTP請求了。而在發(fā)送HTTP請求之前,我們需要設置使用的HTTP請求方法。HttpURLConnection類支持HTTP協議中的各種請求方法,例如GET、POST、PUT等,我們可以使用setRequestMethod()方法進行設置,代碼如下:
conn.setRequestMethod("GET");
接下來在發(fā)送HTTP請求時,可以設置一些更具體的HTTP請求頭,例如Content-Type、User-Agent等。而要設置HTTP請求頭,我們可以使用setRequestProperty()方法。比如我們想請求json格式的內容,就可以設置如下代碼:
conn.setRequestProperty("Content-Type", "application/json");
然后我們就可以獲取服務器的響應結果了,比如使用BufferedReader等IO流來處理輸入流。代碼如下所示:
BufferedReader reader = new BufferedReader(new InputStreamReader(input));
String line = null;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
以上就是使用HttpURLConnection類發(fā)送HTTP請求并讀取服務器響應的基本步驟。大家可以看到,HttpURLConnection的使用與URLConnection的用法幾乎一樣,只是在設置請求方法處有所差別。
1.3 其他設置
但是我們在實際應用中,還要注意異常的處理、設置連接的超時時間、發(fā)送POST請求等問題。
我們在使用HttpURLConnection類發(fā)送HTTP請求時,可能會發(fā)生各種異常,例如網絡連接異常、服務器返回錯誤等。所以為了保證程序的健壯性,我們必須對異常進行適當的處理。代碼如下所示:
try {
URL url = new URL("<www.mobiletrain.org>");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
InputStream input = conn.getInputStream();
} catch (IOException e) {
e.printStackTrace();
}
另外我們在使用HttpURLConnection類發(fā)送HTTP請求時,可能會因為網絡原因等導致連接超時。為了避免連接超時的情況,可以通過setConnectTimeout()方法來設置連接超時時間。以下代碼設置連接超時時間為5秒:
conn.setConnectTimeout(5000);
1.4 發(fā)送POST請求
在前面的案例中,給大家講解了如何發(fā)送GET請求。實際上,GET請求和POST請求是不太一樣的。POST請求比GET請求能夠攜帶更多的數據,也更安全。
如果我們要發(fā)送POST請求,可以使用setRequestMethod()方法,并將請求方法設置為POST。然后使用setDoOutput()方法打開輸出流,并將數據寫入輸出流。代碼如下所示:
try {
URL url = new URL("<www.mobiletrain.org>");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
//設置post請求
conn.setRequestMethod("POST");
conn.setDoOutput(true);
OutputStreamWriter writer = new OutputStreamWriter(conn.getOutputStream());
//傳遞請求參數
writer.write("username=john&password=123456");
writer.flush();
writer.close();
//獲取響應結果
InputStream input = conn.getInputStream();
......
......
} catch (IOException e) {
e.printStackTrace();
}
以上就是HttpURLConnection類的基本使用步驟了,大家會發(fā)現,其實該類與URLConnection的用法基本大同小異,并沒有額外的難度。
1.5 綜合案例--下載文件
接下來就編寫一個案例,利用HttpURLConnection來下載一個網絡圖片到F盤中。
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import org.apache.http.client.ClientProtocolException;
/**
* @author 一一哥Sun
* @company 千鋒教育
*/
public class Demo03 {
public static void main(String[] args) throws ClientProtocolException, IOException {
//創(chuàng)建一個URL對象,關聯圖片地址
URL url = new URL("http://www.mobiletrain.org/images/index/new_logo.png");
//得到一個HttpURLConnection對象
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
//設置請求方法
connection.setRequestMethod("GET");
//得到響應結果
InputStream inputStream = connection.getInputStream();
//創(chuàng)建文件
File file=new File("F://logo.png");
//利用IO流輸出內容到文件中
FileOutputStream outputStream = new FileOutputStream(file);
byte[] buffer = new byte[1024];
int bytesRead;
while ((bytesRead = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, bytesRead);
}
//關閉資源
outputStream.close();
inputStream.close();
//關閉連接
connection.disconnect();
}
}
在這個案例中,大家記得要把文件的路徑盤符設置成自己的,不一定要和我的一樣。而且我們不僅可以下載一個圖片,也可以下載任意格式的文件,你可以根據小編的代碼試試哦。
2. HttpClient類
2.1 簡介
HttpClient是Apache軟件基金會中提供的用于發(fā)送HTTP請求的開源框架,它提供了比HttpURLConnection更加簡單、靈活、可靠的請求方式,使用起來更加的方便。我們經常使用HttpClient構建HTTP客戶端程序,比如在Android移動端中請求Web服務器的接口。
HttpClient作為一個優(yōu)秀的開源框架,具有如下特點:
- 支持HTTP/1.1和HTTP/2協議;
- 支持同步和異步請求;
- 支持連接池和連接復用;
- 支持自定義的連接超時時間和請求超時時間;
- 支持自定義的請求頭和響應頭;
- 支持自定義的Cookie管理和認證方式;
- 支持代理服務器和SSL/TLS安全協議。
2.2 基本使用
HttpClient框架給我們提供了HttpGet和HttpPost類,分別表示GET和POST請求。通過這些類,我們可以設置請求頭、請求參數、請求體等信息,并可以獲取服務器的響應結果。另外HttpClient還給我們提供了一些其他的功能,比如連接池、請求重試、狀態(tài)管理等。接下來就給大家說一下HttpClient的基本開發(fā)步驟。
因為HttpClient是Apache中的開源項目,所以Java源碼中并沒有自帶該類,如果我們想在Java項目中使用HttpClient,需要先導入HttpClient的依賴包。關于導入依賴包,以后我們可以使用Maven或Gradle進行導入,以后也會開辟專門的Maven專欄,歡迎大家持續(xù)關注哦。但現在我們還不具備這些知識,所以可以提前把HttpClient的jar包下載下來,然后手動導入到Java項目中。有了jar包之后,接下來就是基本的開發(fā)步驟了。
首先我們要創(chuàng)建一個HttpClient對象,代碼如下:
CloseableHttpClient client = HttpClients.createDefault();
然后再創(chuàng)建一個Http請求對象,如果想發(fā)起Get請求就創(chuàng)建HttpGet對象,想發(fā)起Post請求就創(chuàng)建HttpPost對象,代碼如下所示:
HttpGet request = new HttpGet(url);
然后利用創(chuàng)建好的請求對象來設置請求頭,代碼如下:
request.setHeader("Content-Type", "application/json");
接下來我們就可以利用HttpClient對象,發(fā)送請求并獲取響應對象了,代碼如下所示:
CloseableHttpResponse response = client.execute(request);
接著我們就可以處理響應數據了,代碼如下所示:
HttpEntity entity = response.getEntity(); String content = EntityUtils.toString(entity);
最后要關閉響應對象和HttpClient對象。
response.close(); client.close();
2.3 綜合案例--請求json
小編設計了一個通過Get請求獲取json接口的案例,但在編寫代碼之前,我們需要提前導入HttpClient的依賴包,如下圖所示:

導入了依賴包之后,我們就可以進行代碼實現了。
import org.apache.http.HttpEntity;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
/**
* @author 一一哥Sun
* @company 千鋒教育
*/
public class Demo02 {
public static void main(String[] args) throws ClientProtocolException, IOException {
//這是一個json接口地址
String url = "https://json.tewx.cn/json/API_kdd531mytfdzm06i?sdAS1dsnuUa3sd=190001&Jsdh4bajs99dii=sohpuisypf4nfaei";
//創(chuàng)建一個HttpClient對象
CloseableHttpClient client = HttpClients.createDefault();
//創(chuàng)建一個Get請求對象
HttpGet request = new HttpGet(url);
//設置請求頭
request.setHeader("Content-Type", "application/json");
//執(zhí)行請求,獲取響應結果
CloseableHttpResponse response = client.execute(request);
//得到響應體
HttpEntity entity = response.getEntity();
//將響應結果轉為字符串
String content = EntityUtils.toString(entity);
System.out.println(content);
}
}
以上幾行代碼,我們就可以把網上的JSON接口內容請求下來,如下圖所示:

其實利用HttpURLConnection也可以實現這樣的效果,兩者的功能都是相似的,但兩者之間也有一些區(qū)別。
3. HttpURLConnection與HttpClient的區(qū)別
HttpURLConnection是Java標準庫中用于發(fā)送HTTP請求的類。它提供了一些方法用來建立與HTTP服務器的連接、設置HTTP請求方法、設置HTTP請求頭、發(fā)送請求、獲取服務器的響應等。該類使用起來比較麻煩,但能夠滿足基本的HTTP請求需求。
HttpClient是一種用于發(fā)送HTTP請求的開源框架,它提供了更加簡單、靈活、可靠的HTTP請求方式,使用起來比Java標準庫中的HttpURLConnection更加方便。
所以如果我們只是想要進行較為簡單的HTTP請求,可以使用HttpURLConnection;如果需要實現更復雜的HTTP請求,則推薦使用HttpClient。
三. 結語
至此,就給大家講解了URL編程和HTTP編程,你學會了嗎?其實無論我們是進行URL編程,還是進行HTTP編程,這兩者的實現過程其實很相似,但在進行實現的時候,我們需要注意以下事項:
- 在URL編程中,我們必須確保URL是一個正確的地址,否則可能會導致URL編程失??;
- 在HttpURLConnection編程中,必須確保正確地設置HTTP請求頭,否則也可能會導致服務器無法正確地處理請求;
- 在URLConnection編程中,必須要正確地處理HTTP響應頭,否則可能會導致無法正確地讀取響應結果;
- 另外在實際應用中,我們還要處理各種異常和錯誤,以確保程序的正確性和穩(wěn)定性。
總之,URL編程和HTTP編程都是Java中用于訪問互聯網資源的標準化方式,Java給我們提供了URL類、HttpURLConnection類和URLConnection類來實現。我們只要在實際應用中,注意URL字符串的處理、HTTP請求頭的設置、HTTP響應頭的處理以及異常和錯誤的處理,進行這些開發(fā)并不難。
以上就是Java網絡通信中URL與HTTP編程技術詳解的詳細內容,更多關于Java URL與HTTP編程的資料請關注腳本之家其它相關文章!
相關文章
Mybatis配置之properties和settings標簽的用法
這篇文章主要介紹了Mybatis配置之properties和settings標簽的用法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-07-07
SpringBoot中的@ConditionalOnMissingBean注解使用詳解
這篇文章主要介紹了SpringBoot中的@ConditionalOnMissingBean注解使用詳解,@ConditionalOnMissingBean作用在@Bean定義上,也就是說在容器加載它作用的Bean時,檢查容器中是否存在目標類型,需要的朋友可以參考下2024-01-01
Java?Web中ServletContext對象詳解與應用
ServletContext是一個容器,可以用來存放變量,供一個web項目中多個Servlet共享,下面這篇文章主要給大家介紹了關于Java?Web中ServletContext對象詳解與應用的相關資料,需要的朋友可以參考下2023-04-04

