Java?HttpURLConnection使用方法與實(shí)例演示分析
一、HttpURLConnection簡述
HttpURLConnection一個抽象類是標(biāo)準(zhǔn)的JAVA接口,該類位于java.net包中,它提供了基本的URL請求,響應(yīng)等功能。
HttpURLConnection是基于http協(xié)議的,支持GET、POST、PUT、DELETE等各種請求方式。如果使用HTTPS協(xié)議請求,可以使用它的子類HttpsURLConnection完成更安全的請求操作。
二、HttpURLConnection使用步驟
創(chuàng)建一個URL對象:
URL url=new URL(“接口地址”)
調(diào)用URL對象的openConnection()來獲取HttpURLConnection對象實(shí)例;
HttpURLConnection connection= (HttpURLConnection) url.openConnection();
設(shè)置HTTP請求使用的方法:GET、POST或其他請求;
connection.setRequestMethod(“GET”);
設(shè)置連接超時,讀取超時的毫秒數(shù),以及服務(wù)器希望得到的一些消息頭;
connection.setConnectTimeout(6*1000);
connection.setReadTimeout(6 * 1000);
調(diào)用getInputStream()方法獲得服務(wù)器返回的輸入流,然后輸入流進(jìn)行讀取了;
InputStream in = connection.getInputStream();
最后調(diào)用disconnect()方法將HTTP連接關(guān)掉;
connection.disconnect();
三、HttpURLConnection使用的方法
設(shè)置連接參數(shù)方法
| 編號 | 方法名 | 說明 |
|---|---|---|
| 1 | setAllowUserInteraction | 如果為 true ,則在允許用戶交互(例如彈出一個身份驗(yàn)證對話框)的上下文中對此 URL 進(jìn)行檢查。 |
| 2 | setDoInput | URL 連接可用于輸入和/或輸出。如果打算使用 URL 連接進(jìn)行輸入,則將 DoInput 標(biāo)志設(shè)置為 true;如果不打算使用,則設(shè)置為 false。默認(rèn)值為 true。 |
| 3 | setDoOutput | URL 連接可用于輸入和/或輸出。如果打算使用 URL 連接進(jìn)行輸出,則將 DoOutput 標(biāo)志設(shè)置為 true;如果不打算使用,則設(shè)置為 false。默認(rèn)值為 false |
| 4 | setIfModifiedSince | 有些協(xié)議支持跳過對象獲取,除非該對象在某個特定時間點(diǎn)之后又進(jìn)行了修改 |
| 5 | setUseCaches | 如果為 true ,則只要有條件就允許協(xié)議使用緩存。 |
| 6 | setDefaultAllowUserInteraction | 默認(rèn)值為 “sticky”,它是所有 URLConnection 的其中一種靜態(tài)狀態(tài)。此標(biāo)志適用于下一個及后續(xù)創(chuàng)建的所有 URLConnection。 |
| 7 | setDefaultUseCaches | 將此 URLConnection 的 useCaches 字段的值設(shè)置為指定的值。 |
設(shè)置請求頭或響應(yīng)體
| 編號 | 方法 | 說明 |
|---|---|---|
| 1 | setRequestProperty(key,value) | 設(shè)置一般請求屬性。如果已存在具有該關(guān)鍵字的屬性,則用新值改寫其值。注:HTTP 要求所有能夠合法擁有多個具有相同鍵的實(shí)例的請求屬性,使用以逗號分隔的列表語法,這樣可實(shí)現(xiàn)將多個屬性添加到一個屬性中。 |
| 2 | addRequestProperty(key,value) | 添加由鍵值對指定的一般請求屬性。此方法不會改寫與相同鍵關(guān)聯(lián)的現(xiàn)有值 |
發(fā)送URL請求
| 編號 | 方法 | 說明 |
|---|---|---|
| 1 | getOutputStream | 建立實(shí)際連接之后,就是發(fā)送請求,把請求參數(shù)傳到服務(wù)器,這就需要使用outputStream把請求參數(shù)傳給服務(wù)器 |
獲取響應(yīng)
| 編號 | 方法 | 說明 |
|---|---|---|
| 1 | getContent | 檢索此 URL 連接的內(nèi)容;此方法首先通過調(diào)用 getContentType 方法確定對象的內(nèi)容類型;如果這是該應(yīng)用程序第一次遇到的特定內(nèi)容類型,則會創(chuàng)建適用于該類型的內(nèi)容處理程序:如果該應(yīng)用程序已使用 setContentHandlerFactory 方法建立了內(nèi)容處理程序工廠實(shí)例,則調(diào)用此實(shí)例的 createContentHandler 方法,內(nèi)容類型為其中的一個參數(shù);結(jié)果為該內(nèi)容類型的內(nèi)容處理程序。如果尚未建立任何內(nèi)容處理程序工廠,或者如果工廠的createContentHandler 方法返回 null`,則應(yīng)用程序會加載以下名稱的類 |
| 2 | getHeaderField | 返回第 n 個頭字段的值。如果少于 n+1 個字段,則返回 null 。此方法可與 getHeaderFieldKey 方法配合使用,以迭代消息中的所有頭 |
| 3 | getInputStream | 返回從此打開的連接讀取的輸入流。 在讀取返回的輸入流時,如果在數(shù)據(jù)可供讀取之前達(dá)到讀入超時時間,則會拋出 SocketTimeoutException。 |
| 4 | getResponseCode | 獲取服務(wù)器的響應(yīng)代碼 |
| 5 | getResponseMessage | 獲取服務(wù)器的響應(yīng)消息 |
| 6 | getResponseMethod | 獲取發(fā)送請求的方法 |
相應(yīng)的信息頭用以下方法獲取
| 編碼 | 方法 | 說明 |
|---|---|---|
| 1 | getContentEncoding | 返回 content-encoding 頭字段的值 |
| 2 | getContentLength | 返回 content-length 頭字段的值。 |
| 3 | getContentType | 返回 content-type 頭字段的值。 |
| 4 | getDate | 返回 date 頭字段的值。 |
| 5 | getExpiration | 返回 expires 頭字段的值。 |
四、HttpURLConnection使用演示
Get方式
public void testDoGet(){
String api="";
HttpURLConnection connection = null;
InputStream in=null;
BufferedReader reader=null;
try{
//構(gòu)造一個URL對象
URL url = new URL(api);
//獲取URLConnection對象
connection= (HttpURLConnection) url.openConnection();
//getOutputStream會隱含的進(jìn)行connect(即:如同調(diào)用上面的connect()方法,所以在開發(fā)中不調(diào)用connect()也可以)
in = connection.getInputStream();
//通過InputStreamReader將字節(jié)流轉(zhuǎn)換成字符串,在通過BufferedReader將字符流轉(zhuǎn)換成自帶緩沖流
reader = new BufferedReader(new InputStreamReader(in, StandardCharsets.UTF_8));
StringBuilder sb = new StringBuilder();
String line = null;
//按行讀取
while ((line = reader.readLine()) != null) {
sb.append(line);
}
String response= sb.toString();
System.out.println(response);
}catch (Exception exception){
exception.printStackTrace();
}finally {
if (connection != null) {
connection.disconnect();
}
if (in != null) {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (reader != null) {
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}POST方式
public void testDoPost(){
String apiUrl = "https://www.goyeer.com/api";
String username = "Goyeer";
String password = "123456";
String tenantUrl = "";
HttpURLConnection conn = null;
OutputStream out = null;
InputStream in = null;
String idToken = null;
try
{
// 構(gòu)造一個URL對象
URL url = new URL(apiUrl);
// 獲取URLConnection對象
conn = (HttpURLConnection) url.openConnection();
// 限制socket等待建立連接的時間,超時將會拋出java.net.SocketTimeoutException
conn.setConnectTimeout(3000);
// 限制輸入流等待數(shù)據(jù)到達(dá)的時間,超時將會拋出java.net.SocketTimeoutException
conn.setReadTimeout(3000);
// 設(shè)定請求的方法為"POST",默認(rèn)是GET
conn.setRequestMethod("POST");
// 設(shè)置傳送的內(nèi)容類型是json格式
conn.setRequestProperty("Content-Type", "application/json;charset=utf-8");
// 接收的內(nèi)容類型也是json格式
conn.setRequestProperty("Accept", "application/json;charset=utf-8");
// 設(shè)置是否從httpUrlConnection讀入,默認(rèn)情況下是true
conn.setDoInput(true);
// 由于URLConnection在默認(rèn)的情況下不允許輸出,所以在請求輸出流之前必須調(diào)用setDoOutput(true)。為一個HTTP URL將doOutput設(shè)置為true時,請求方法將由GET變?yōu)镻OST
conn.setDoOutput(true);
// 是否使用緩存,Post方式不能使用緩存
conn.setUseCaches(false);
// 準(zhǔn)備數(shù)據(jù)
JSONObject json = new JSONObject();
json.put("username", username);
json.put("password", DigestUtils.md5Hex(password));
json.put("tenantUrl", tenantUrl);
// 返回一個OutputStream,可以用來寫入數(shù)據(jù)傳送給服務(wù)器
out = conn.getOutputStream();
// 將數(shù)據(jù)寫入到輸出流中
out.write(json.toString().getBytes(StandardCharsets.UTF_8));
// 刷新管道
out.flush();
// 建立連接
conn.connect();
// 判斷數(shù)字響應(yīng)碼是否是200
int responseCode = conn.getResponseCode();
String result="";
if (responseCode == 200) {
// 獲取輸入流
in = conn.getInputStream();
// 獲取返回的內(nèi)容
StringWriter sw = new StringWriter();
InputStreamReader reader = new InputStreamReader(in, StandardCharsets.UTF_8);
char[] buffer = new char[4096];
for (int n = 0; -1 != (n = reader.read(buffer)); ) {
sw.write(buffer, 0, n);
}
result = sw.toString();
System.out.println(result);
}
}catch (Exception exception){
exception.printStackTrace();
}finally {
if (conn != null) {
conn.disconnect();
}
if (out != null) {
out.close();
}
if (in != null) {
in.close();
}
}
}五、HttpURLConnection使用總結(jié)
- HttpURLConnection對象不能直接構(gòu)造,需使用URL類中的openConnection()方法來創(chuàng)建實(shí)例
- HttpURLConnection對象屬性設(shè)置,需在connect()方法執(zhí)行之前完成HttpURLConnection的connect()函數(shù),其本質(zhì)是建立一個與服務(wù)器的TCP連接,但并未實(shí)際發(fā)送HTTP請求 HTTP請求靠調(diào)用getInputStream()、getResponseCode()等方法觸發(fā),HttpURLConnection是基于HTTP協(xié)議的,其底層通過socket通信實(shí)現(xiàn)不設(shè)置超時(timeout),當(dāng)網(wǎng)絡(luò)異常的情況下,可能會導(dǎo)致程序僵死而不繼續(xù)往下執(zhí)行
- HTTP正文的內(nèi)容是通過OutputStream流寫入,向流中寫入的數(shù)據(jù)不會立即發(fā)送到網(wǎng)絡(luò),而是存在于內(nèi)存緩沖區(qū)中,待流關(guān)閉時,根據(jù)寫入的內(nèi)容生成HTTP正文。
- 調(diào)用getInputStream()方法時,會返回一個輸入流,用于從中讀取服務(wù)器對于HTTP請求的返回信息
- 當(dāng)獲取HTTP響應(yīng)的時候,請求就會自動的發(fā)起
- 如使用HttpURLConnection.getInputStream()方法的時系統(tǒng)會自動調(diào)用connect()方法
- JDK8自帶的HttpURLConnection 默認(rèn)啟用keepAlive,支持HTTP / 1.1和HTTP / 1.0持久連接,使用后的HttpURLConnection會放入緩存中供以后的同host:port的請求重用底層socket在keepAlive超時之前不會關(guān)閉。
- 當(dāng)在HttpURLConnection的header中加入Connection: close,則此連接不會啟用keepAlive如果想啟用keepAlive,程序請求完畢后必須調(diào)用HttpURLConnection.getInputStream().close()(此操作用于歸還長連接給緩存,下次同host:port的請求重用底層socket連接),而不調(diào)用HttpURLConnection.disconnect()(表示關(guān)閉底層socket連接,不會啟用keepAlive)。
到此這篇關(guān)于Java HttpURLConnection使用方法與實(shí)例演示分析的文章就介紹到這了,更多相關(guān)Java HttpURLConnection使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
完美解決Eclipse導(dǎo)入的項(xiàng)目上有個紅叉,但不影響項(xiàng)目運(yùn)行的問題
這篇文章主要介紹了完美解決Eclipse導(dǎo)入的項(xiàng)目上有個紅叉,但不影響項(xiàng)目運(yùn)行的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-01-01
Java多線程之并發(fā)編程的基石CAS機(jī)制詳解
這篇文章主要介紹了java并發(fā)編程之cas詳解,涉及cas使用場景和cas用作原子操作等內(nèi)容,具有一定參考價值,需要的朋友可以了解下2021-09-09
Spring結(jié)合WebSocket實(shí)現(xiàn)實(shí)時通信的教程詳解
WebSocket?是基于TCP/IP協(xié)議,獨(dú)立于HTTP協(xié)議的通信協(xié)議,本文將使用Spring結(jié)合WebSocket實(shí)現(xiàn)實(shí)時通信功能,有需要的小伙伴可以參考一下2024-01-01
JAVA實(shí)現(xiàn)紅包分發(fā)的示例代碼
這篇文章主要介紹了JAVA實(shí)現(xiàn)紅包分發(fā)的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03
java中的HashSet與 == 和 equals的區(qū)別示例解析
HashSet是Java中基于哈希表實(shí)現(xiàn)的集合類,特點(diǎn)包括:元素唯一、無序和可包含null,本文給大家介紹java中的HashSet與 == 和 equals的區(qū)別,感興趣的朋友一起看看吧2025-02-02

