Java網(wǎng)絡(luò)通信中URL與HTTP編程技術(shù)詳解
一. URL簡介
要想搞清楚URL編程,我們得先來看看什么是URL,所以先來給大家介紹一下URL的概念。
1. 概念
URL(Uniform Resource Locator,統(tǒng)一資源定位符) ,主要用于標(biāo)識和定位互聯(lián)網(wǎng)上的資源,例如網(wǎng)頁、圖片、音頻、視頻等。通過URL,我們可以向服務(wù)器發(fā)送請求,獲取需要的資源。
2. 組成
一個URL可以由多個部分組成,包括協(xié)議、主機名、路徑和查詢參數(shù)等。常見的URL格式如下所示:
#基本組成 protocol://host:port/path?query #例如 http://www.qfedu.com:80/login.html?username=syc
其中,各部分含義如下所示:
- protocol:協(xié)議部分,可以是HTTP、FTP等;
- host:主機名或IP地址,例如 www.mobiletrain.org;
- port:端口號,例如80、8080等;
- path:路徑,用于標(biāo)識具體的資源位置,例如/index.html;
- query:查詢參數(shù),用于傳遞具體的參數(shù)給服務(wù)器,例如?key1=value1&key2=value2。
了解了URL的含義之后,我們就可以開始進行URL編程了。
二. URL編程
1. 簡介
URL編程也是Java中用于訪問互聯(lián)網(wǎng)資源的一種標(biāo)準(zhǔn)化方式。通過URL編程,我們可以基于HTTP、FTP等協(xié)議,方便地獲取網(wǎng)頁、圖片、音頻、視頻等資源。
另外我們也可以通過URL編程中的URLConnection、HttpURLConnection等類,向Web服務(wù)器或HTTP服務(wù)器發(fā)送請求,來建立與Web或HTTP服務(wù)器的連接,發(fā)送GET或POST請求,并讀取服務(wù)器返回的響應(yīng)信息。
接下來給大家分別介紹一下URL、URLConnection等與URL編程相關(guān)的核心類。
2. URL類
要實現(xiàn)URL編程,首先我們得使用java.net.URL類來創(chuàng)建一個URL對象,然后使用該對象來獲取指定資源的輸入流。
URL類給我們提供了多個構(gòu)造方法,其中最常用的是使用URL字符串來創(chuàng)建URL對象。例如,以下代碼就是通過URL字符串來創(chuàng)建一個URL對象:
URL url = new URL("<www.mobiletrain.org>");
利用這個URL對象,我們可以進一步使用openStream()方法來獲取指定資源的輸入流。例如,以下代碼就獲取了指定資源的輸入流:
InputStream input = url.openStream();
在實際應(yīng)用中,我們可以使用BufferedReader等類來處理輸入流。
3. URLConnection類
3.1 簡介
Java.net.URLConnection是負(fù)責(zé)與HTTP服務(wù)器建立連接的通用類,它給我們提供了一些方法可以向服務(wù)器發(fā)送請求并讀取服務(wù)器的響應(yīng)。比如,setRequestProperty()方法可以用于設(shè)置請求頭信息,setDoOutput()方法可以用于指示是否向服務(wù)器發(fā)送請求體等。另外URLConnection還是HttpURLConnection的父類,但與之不同的是,URLConnection還額外支持FTP、Gopher等協(xié)議。
從實現(xiàn)原理上來說,URLConnection類主要是通過創(chuàng)建一個連接對象,然后使用這個連接對象向服務(wù)器發(fā)送請求并讀取服務(wù)器的響應(yīng)。而在創(chuàng)建連接對象時, URLConnection會根據(jù)指定的URL自動選擇合適的網(wǎng)絡(luò)協(xié)議。在連接對象創(chuàng)建成功后,我們可以使用connect()方法連接到服務(wù)器。當(dāng)連接成功后,我們就可以使用getInputStream()方法來獲取服務(wù)器返回的輸入流,然后使用這個輸入流讀取服務(wù)器的響應(yīng)結(jié)果。
3.2 基本使用
接下來再給大家介紹一下URLConnection類的基本使用步驟。URLConnection的使用,整體可以分為發(fā)起請求和獲取響應(yīng)兩個步驟,所以接下來我也是按這種思路給大家進行介紹。
我們首先得創(chuàng)建一個URLConnection對象,代碼如下:
//大家可以選擇一個合適的url網(wǎng)址 URL url = new URL("<www.mobiletrain.org>"); //獲取連接對象 URLConnection conn = url.openConnection();
獲取了URLConnection對象之后,我們就可以向服務(wù)器發(fā)起請求了,代碼如下:
//指示是否向服務(wù)器發(fā)送請求體 conn.setDoOutput(true); //通過輸出流,向服務(wù)器發(fā)送請求參數(shù)或請求體 OutputStreamWriter writer = new OutputStreamWriter(conn.getOutputStream()); writer.write("param1=value1¶m2=value2"); writer.flush(); writer.close();
在向服務(wù)器發(fā)送了請求之后,如果我們想得到服務(wù)器返回來的響應(yīng)信息,可以使用如下方法:
//獲得服務(wù)器返回的響應(yīng)流 InputStream input = conn.getInputStream();
然后我們就可以對這個響應(yīng)流進行操作,得到具體的內(nèi)容,例如下面的代碼:
BufferedReader reader = new BufferedReader(new InputStreamReader(input)); String line = null; while ((line = reader.readLine()) != null) { System.out.println(line); }
當(dāng)然,服務(wù)器返回來的信息不一定就是文本信息,也有可能是音頻、視頻、文件等內(nèi)容,此時如果使用字符流就不合適了。我們也可以把InputStream轉(zhuǎn)換為字節(jié)流進行操作,通過字節(jié)得到合適的文件格式。
二. HTTP編程
其實HTTP編程與URL編程非常類似,兩者的使用基本一致,也是要通過java.net包中的API來實現(xiàn),比如URL類和HttpURLConnection、HttpClient等類。其中URL類我們已經(jīng)在前面講解過,接下來我們再了解一下HttpURLConnection類和HttpClient類的相關(guān)內(nèi)容吧。
1. HttpURLConnection類
1.1 簡介
HttpURLConnection繼承自URLConnection類,該類也是用于與HTTP服務(wù)器建立連接的類。它提供了一些方法,可以讓我們來發(fā)送HTTP請求并讀取服務(wù)器的響應(yīng)。
我們知道,URLConnection類是所有URL協(xié)議的通用父類,它提供了一些通用的方法來建立與服務(wù)器的連接,發(fā)送請求并讀取服務(wù)器的響應(yīng)。但如果我們想要更多的HTTP功能,就可以使用HttpURLConnection類,否則可以使用URLConnection類。
1.2 基本使用
接下來也把HttpURLConnection的使用步驟給大家展示一下。
如果我們要使用HttpURLConnection,首先得創(chuàng)建一個URL對象,然后調(diào)用該對象的openConnection()方法來強制轉(zhuǎn)換得到一個HttpURLConnection對象。代碼示例如下:
URL url = new URL("<www.mobiletrain.org>"); //強制類型轉(zhuǎn)換 HttpURLConnection conn = (HttpURLConnection) url.openConnection();
在得到連接對象之后,我們就可以發(fā)送HTTP請求了。而在發(fā)送HTTP請求之前,我們需要設(shè)置使用的HTTP請求方法。HttpURLConnection類支持HTTP協(xié)議中的各種請求方法,例如GET、POST、PUT等,我們可以使用setRequestMethod()方法進行設(shè)置,代碼如下:
conn.setRequestMethod("GET");
接下來在發(fā)送HTTP請求時,可以設(shè)置一些更具體的HTTP請求頭,例如Content-Type、User-Agent等。而要設(shè)置HTTP請求頭,我們可以使用setRequestProperty()方法。比如我們想請求json格式的內(nèi)容,就可以設(shè)置如下代碼:
conn.setRequestProperty("Content-Type", "application/json");
然后我們就可以獲取服務(wù)器的響應(yīng)結(jié)果了,比如使用BufferedReader等IO流來處理輸入流。代碼如下所示:
BufferedReader reader = new BufferedReader(new InputStreamReader(input)); String line = null; while ((line = reader.readLine()) != null) { System.out.println(line); }
以上就是使用HttpURLConnection類發(fā)送HTTP請求并讀取服務(wù)器響應(yīng)的基本步驟。大家可以看到,HttpURLConnection的使用與URLConnection的用法幾乎一樣,只是在設(shè)置請求方法處有所差別。
1.3 其他設(shè)置
但是我們在實際應(yīng)用中,還要注意異常的處理、設(shè)置連接的超時時間、發(fā)送POST請求等問題。
我們在使用HttpURLConnection類發(fā)送HTTP請求時,可能會發(fā)生各種異常,例如網(wǎng)絡(luò)連接異常、服務(wù)器返回錯誤等。所以為了保證程序的健壯性,我們必須對異常進行適當(dāng)?shù)奶幚?。代碼如下所示:
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請求時,可能會因為網(wǎng)絡(luò)原因等導(dǎo)致連接超時。為了避免連接超時的情況,可以通過setConnectTimeout()方法來設(shè)置連接超時時間。以下代碼設(shè)置連接超時時間為5秒:
conn.setConnectTimeout(5000);
1.4 發(fā)送POST請求
在前面的案例中,給大家講解了如何發(fā)送GET請求。實際上,GET請求和POST請求是不太一樣的。POST請求比GET請求能夠攜帶更多的數(shù)據(jù),也更安全。
如果我們要發(fā)送POST請求,可以使用setRequestMethod()方法,并將請求方法設(shè)置為POST。然后使用setDoOutput()方法打開輸出流,并將數(shù)據(jù)寫入輸出流。代碼如下所示:
try { URL url = new URL("<www.mobiletrain.org>"); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); //設(shè)置post請求 conn.setRequestMethod("POST"); conn.setDoOutput(true); OutputStreamWriter writer = new OutputStreamWriter(conn.getOutputStream()); //傳遞請求參數(shù) writer.write("username=john&password=123456"); writer.flush(); writer.close(); //獲取響應(yīng)結(jié)果 InputStream input = conn.getInputStream(); ...... ...... } catch (IOException e) { e.printStackTrace(); }
以上就是HttpURLConnection類的基本使用步驟了,大家會發(fā)現(xiàn),其實該類與URLConnection的用法基本大同小異,并沒有額外的難度。
1.5 綜合案例--下載文件
接下來就編寫一個案例,利用HttpURLConnection來下載一個網(wǎng)絡(luò)圖片到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對象,關(guān)聯(lián)圖片地址 URL url = new URL("http://www.mobiletrain.org/images/index/new_logo.png"); //得到一個HttpURLConnection對象 HttpURLConnection connection = (HttpURLConnection) url.openConnection(); //設(shè)置請求方法 connection.setRequestMethod("GET"); //得到響應(yīng)結(jié)果 InputStream inputStream = connection.getInputStream(); //創(chuàng)建文件 File file=new File("F://logo.png"); //利用IO流輸出內(nèi)容到文件中 FileOutputStream outputStream = new FileOutputStream(file); byte[] buffer = new byte[1024]; int bytesRead; while ((bytesRead = inputStream.read(buffer)) != -1) { outputStream.write(buffer, 0, bytesRead); } //關(guān)閉資源 outputStream.close(); inputStream.close(); //關(guān)閉連接 connection.disconnect(); } }
在這個案例中,大家記得要把文件的路徑盤符設(shè)置成自己的,不一定要和我的一樣。而且我們不僅可以下載一個圖片,也可以下載任意格式的文件,你可以根據(jù)小編的代碼試試哦。
2. HttpClient類
2.1 簡介
HttpClient是Apache軟件基金會中提供的用于發(fā)送HTTP請求的開源框架,它提供了比HttpURLConnection更加簡單、靈活、可靠的請求方式,使用起來更加的方便。我們經(jīng)常使用HttpClient構(gòu)建HTTP客戶端程序,比如在Android移動端中請求Web服務(wù)器的接口。
HttpClient作為一個優(yōu)秀的開源框架,具有如下特點:
- 支持HTTP/1.1和HTTP/2協(xié)議;
- 支持同步和異步請求;
- 支持連接池和連接復(fù)用;
- 支持自定義的連接超時時間和請求超時時間;
- 支持自定義的請求頭和響應(yīng)頭;
- 支持自定義的Cookie管理和認(rèn)證方式;
- 支持代理服務(wù)器和SSL/TLS安全協(xié)議。
2.2 基本使用
HttpClient框架給我們提供了HttpGet和HttpPost類,分別表示GET和POST請求。通過這些類,我們可以設(shè)置請求頭、請求參數(shù)、請求體等信息,并可以獲取服務(wù)器的響應(yīng)結(jié)果。另外HttpClient還給我們提供了一些其他的功能,比如連接池、請求重試、狀態(tài)管理等。接下來就給大家說一下HttpClient的基本開發(fā)步驟。
因為HttpClient是Apache中的開源項目,所以Java源碼中并沒有自帶該類,如果我們想在Java項目中使用HttpClient,需要先導(dǎo)入HttpClient的依賴包。關(guān)于導(dǎo)入依賴包,以后我們可以使用Maven或Gradle進行導(dǎo)入,以后也會開辟專門的Maven專欄,歡迎大家持續(xù)關(guān)注哦。但現(xiàn)在我們還不具備這些知識,所以可以提前把HttpClient的jar包下載下來,然后手動導(dǎo)入到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)建好的請求對象來設(shè)置請求頭,代碼如下:
request.setHeader("Content-Type", "application/json");
接下來我們就可以利用HttpClient對象,發(fā)送請求并獲取響應(yīng)對象了,代碼如下所示:
CloseableHttpResponse response = client.execute(request);
接著我們就可以處理響應(yīng)數(shù)據(jù)了,代碼如下所示:
HttpEntity entity = response.getEntity(); String content = EntityUtils.toString(entity);
最后要關(guān)閉響應(yīng)對象和HttpClient對象。
response.close(); client.close();
2.3 綜合案例--請求json
小編設(shè)計了一個通過Get請求獲取json接口的案例,但在編寫代碼之前,我們需要提前導(dǎo)入HttpClient的依賴包,如下圖所示:
導(dǎo)入了依賴包之后,我們就可以進行代碼實現(xiàn)了。
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); //設(shè)置請求頭 request.setHeader("Content-Type", "application/json"); //執(zhí)行請求,獲取響應(yīng)結(jié)果 CloseableHttpResponse response = client.execute(request); //得到響應(yīng)體 HttpEntity entity = response.getEntity(); //將響應(yīng)結(jié)果轉(zhuǎn)為字符串 String content = EntityUtils.toString(entity); System.out.println(content); } }
以上幾行代碼,我們就可以把網(wǎng)上的JSON接口內(nèi)容請求下來,如下圖所示:
其實利用HttpURLConnection也可以實現(xiàn)這樣的效果,兩者的功能都是相似的,但兩者之間也有一些區(qū)別。
3. HttpURLConnection與HttpClient的區(qū)別
HttpURLConnection是Java標(biāo)準(zhǔn)庫中用于發(fā)送HTTP請求的類。它提供了一些方法用來建立與HTTP服務(wù)器的連接、設(shè)置HTTP請求方法、設(shè)置HTTP請求頭、發(fā)送請求、獲取服務(wù)器的響應(yīng)等。該類使用起來比較麻煩,但能夠滿足基本的HTTP請求需求。
HttpClient是一種用于發(fā)送HTTP請求的開源框架,它提供了更加簡單、靈活、可靠的HTTP請求方式,使用起來比Java標(biāo)準(zhǔn)庫中的HttpURLConnection更加方便。
所以如果我們只是想要進行較為簡單的HTTP請求,可以使用HttpURLConnection;如果需要實現(xiàn)更復(fù)雜的HTTP請求,則推薦使用HttpClient。
三. 結(jié)語
至此,就給大家講解了URL編程和HTTP編程,你學(xué)會了嗎?其實無論我們是進行URL編程,還是進行HTTP編程,這兩者的實現(xiàn)過程其實很相似,但在進行實現(xiàn)的時候,我們需要注意以下事項:
- 在URL編程中,我們必須確保URL是一個正確的地址,否則可能會導(dǎo)致URL編程失?。?/li>
- 在HttpURLConnection編程中,必須確保正確地設(shè)置HTTP請求頭,否則也可能會導(dǎo)致服務(wù)器無法正確地處理請求;
- 在URLConnection編程中,必須要正確地處理HTTP響應(yīng)頭,否則可能會導(dǎo)致無法正確地讀取響應(yīng)結(jié)果;
- 另外在實際應(yīng)用中,我們還要處理各種異常和錯誤,以確保程序的正確性和穩(wěn)定性。
總之,URL編程和HTTP編程都是Java中用于訪問互聯(lián)網(wǎng)資源的標(biāo)準(zhǔn)化方式,Java給我們提供了URL類、HttpURLConnection類和URLConnection類來實現(xiàn)。我們只要在實際應(yīng)用中,注意URL字符串的處理、HTTP請求頭的設(shè)置、HTTP響應(yīng)頭的處理以及異常和錯誤的處理,進行這些開發(fā)并不難。
以上就是Java網(wǎng)絡(luò)通信中URL與HTTP編程技術(shù)詳解的詳細(xì)內(nèi)容,更多關(guān)于Java URL與HTTP編程的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Mybatis配置之properties和settings標(biāo)簽的用法
這篇文章主要介紹了Mybatis配置之properties和settings標(biāo)簽的用法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-07-07SpringBoot中的@ConditionalOnMissingBean注解使用詳解
這篇文章主要介紹了SpringBoot中的@ConditionalOnMissingBean注解使用詳解,@ConditionalOnMissingBean作用在@Bean定義上,也就是說在容器加載它作用的Bean時,檢查容器中是否存在目標(biāo)類型,需要的朋友可以參考下2024-01-01Java?Web中ServletContext對象詳解與應(yīng)用
ServletContext是一個容器,可以用來存放變量,供一個web項目中多個Servlet共享,下面這篇文章主要給大家介紹了關(guān)于Java?Web中ServletContext對象詳解與應(yīng)用的相關(guān)資料,需要的朋友可以參考下2023-04-04JAVA 實現(xiàn)二叉樹(鏈?zhǔn)酱鎯Y(jié)構(gòu))
本篇文章主要介紹用JAVA 實現(xiàn)二叉樹,并提供實例.對二叉樹數(shù)據(jù)結(jié)構(gòu)很好的學(xué)習(xí)實踐,有需要的朋友可以參考下2016-07-07SpringMvc配置靜態(tài)資源訪問路徑的實現(xiàn)
本文主要介紹了SpringMvc配置靜態(tài)資源訪問路徑的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07