最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java?HttpURLConnection使用方法與實(shí)例演示分析

 更新時(shí)間:2023年10月01日 08:58:53   作者:goyeer  
這篇文章主要介紹了Java?HttpURLConnection使用方法與實(shí)例演示,HttpURLConnection一個(gè)抽象類是標(biāo)準(zhǔn)的JAVA接口,該類位于java.net包中,它提供了基本的URL請(qǐng)求,響應(yīng)等功能,下面我們來深入看看

一、HttpURLConnection簡(jiǎn)述

HttpURLConnection一個(gè)抽象類是標(biāo)準(zhǔn)的JAVA接口,該類位于java.net包中,它提供了基本的URL請(qǐng)求,響應(yīng)等功能。

HttpURLConnection是基于http協(xié)議的,支持GET、POST、PUT、DELETE等各種請(qǐng)求方式。如果使用HTTPS協(xié)議請(qǐng)求,可以使用它的子類HttpsURLConnection完成更安全的請(qǐng)求操作。

二、HttpURLConnection使用步驟

創(chuàng)建一個(gè)URL對(duì)象:

URL url=new URL(“接口地址”)

調(diào)用URL對(duì)象的openConnection()來獲取HttpURLConnection對(duì)象實(shí)例;

HttpURLConnection connection= (HttpURLConnection) url.openConnection();

設(shè)置HTTP請(qǐng)求使用的方法:GET、POST或其他請(qǐng)求;

connection.setRequestMethod(“GET”);

設(shè)置連接超時(shí),讀取超時(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ù)方法

編號(hào)方法名說明
1setAllowUserInteraction如果為 true ,則在允許用戶交互(例如彈出一個(gè)身份驗(yàn)證對(duì)話框)的上下文中對(duì)此 URL 進(jìn)行檢查。
2setDoInputURL 連接可用于輸入和/或輸出。如果打算使用 URL 連接進(jìn)行輸入,則將 DoInput 標(biāo)志設(shè)置為 true;如果不打算使用,則設(shè)置為 false。默認(rèn)值為 true。
3setDoOutputURL 連接可用于輸入和/或輸出。如果打算使用 URL 連接進(jìn)行輸出,則將 DoOutput 標(biāo)志設(shè)置為 true;如果不打算使用,則設(shè)置為 false。默認(rèn)值為 false
4setIfModifiedSince有些協(xié)議支持跳過對(duì)象獲取,除非該對(duì)象在某個(gè)特定時(shí)間點(diǎn)之后又進(jìn)行了修改
5setUseCaches如果為 true ,則只要有條件就允許協(xié)議使用緩存。
6setDefaultAllowUserInteraction默認(rèn)值為 “sticky”,它是所有 URLConnection 的其中一種靜態(tài)狀態(tài)。此標(biāo)志適用于下一個(gè)及后續(xù)創(chuàng)建的所有 URLConnection。
7setDefaultUseCaches將此 URLConnection useCaches 字段的值設(shè)置為指定的值。

設(shè)置請(qǐng)求頭或響應(yīng)體

編號(hào)方法說明
1setRequestProperty(key,value)設(shè)置一般請(qǐng)求屬性。如果已存在具有該關(guān)鍵字的屬性,則用新值改寫其值。注:HTTP 要求所有能夠合法擁有多個(gè)具有相同鍵的實(shí)例的請(qǐng)求屬性,使用以逗號(hào)分隔的列表語法,這樣可實(shí)現(xiàn)將多個(gè)屬性添加到一個(gè)屬性中。
2addRequestProperty(key,value)添加由鍵值對(duì)指定的一般請(qǐng)求屬性。此方法不會(huì)改寫與相同鍵關(guān)聯(lián)的現(xiàn)有值

發(fā)送URL請(qǐng)求

編號(hào)方法說明
1getOutputStream建立實(shí)際連接之后,就是發(fā)送請(qǐng)求,把請(qǐng)求參數(shù)傳到服務(wù)器,這就需要使用outputStream把請(qǐng)求參數(shù)傳給服務(wù)器

獲取響應(yīng)

編號(hào)方法說明
1getContent檢索此 URL 連接的內(nèi)容;此方法首先通過調(diào)用 getContentType 方法確定對(duì)象的內(nèi)容類型;如果這是該應(yīng)用程序第一次遇到的特定內(nèi)容類型,則會(huì)創(chuàng)建適用于該類型的內(nèi)容處理程序:如果該應(yīng)用程序已使用 setContentHandlerFactory 方法建立了內(nèi)容處理程序工廠實(shí)例,則調(diào)用此實(shí)例的 createContentHandler 方法,內(nèi)容類型為其中的一個(gè)參數(shù);結(jié)果為該內(nèi)容類型的內(nèi)容處理程序。如果尚未建立任何內(nèi)容處理程序工廠,或者如果工廠的createContentHandler 方法返回 null`,則應(yīng)用程序會(huì)加載以下名稱的類
2getHeaderField返回第 n 個(gè)頭字段的值。如果少于 n+1 個(gè)字段,則返回 null 。此方法可與 getHeaderFieldKey 方法配合使用,以迭代消息中的所有頭
3getInputStream返回從此打開的連接讀取的輸入流。 在讀取返回的輸入流時(shí),如果在數(shù)據(jù)可供讀取之前達(dá)到讀入超時(shí)時(shí)間,則會(huì)拋出 SocketTimeoutException。
4getResponseCode獲取服務(wù)器的響應(yīng)代碼
5getResponseMessage獲取服務(wù)器的響應(yīng)消息
6getResponseMethod獲取發(fā)送請(qǐng)求的方法

相應(yīng)的信息頭用以下方法獲取

編碼方法說明
1getContentEncoding返回 content-encoding 頭字段的值
2getContentLength返回 content-length 頭字段的值。
3getContentType返回 content-type 頭字段的值。
4getDate返回 date 頭字段的值。
5getExpiration返回 expires 頭字段的值。

四、HttpURLConnection使用演示

Get方式

public void testDoGet(){
        String api="";
        HttpURLConnection connection = null;
        InputStream in=null;
        BufferedReader reader=null;
        try{
            //構(gòu)造一個(gè)URL對(duì)象
            URL url = new URL(api);
            //獲取URLConnection對(duì)象
            connection= (HttpURLConnection) url.openConnection();
            //getOutputStream會(huì)隱含的進(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)造一個(gè)URL對(duì)象
            URL url = new URL(apiUrl);
            // 獲取URLConnection對(duì)象
            conn = (HttpURLConnection) url.openConnection();
            // 限制socket等待建立連接的時(shí)間,超時(shí)將會(huì)拋出java.net.SocketTimeoutException
            conn.setConnectTimeout(3000);
            // 限制輸入流等待數(shù)據(jù)到達(dá)的時(shí)間,超時(shí)將會(huì)拋出java.net.SocketTimeoutException
            conn.setReadTimeout(3000);
            // 設(shè)定請(qǐng)求的方法為"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)的情況下不允許輸出,所以在請(qǐng)求輸出流之前必須調(diào)用setDoOutput(true)。為一個(gè)HTTP URL將doOutput設(shè)置為true時(shí),請(qǐng)求方法將由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);
            // 返回一個(gè)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對(duì)象不能直接構(gòu)造,需使用URL類中的openConnection()方法來創(chuàng)建實(shí)例
  • HttpURLConnection對(duì)象屬性設(shè)置,需在connect()方法執(zhí)行之前完成HttpURLConnection的connect()函數(shù),其本質(zhì)是建立一個(gè)與服務(wù)器的TCP連接,但并未實(shí)際發(fā)送HTTP請(qǐng)求 HTTP請(qǐng)求靠調(diào)用getInputStream()、getResponseCode()等方法觸發(fā),HttpURLConnection是基于HTTP協(xié)議的,其底層通過socket通信實(shí)現(xiàn)不設(shè)置超時(shí)(timeout),當(dāng)網(wǎng)絡(luò)異常的情況下,可能會(huì)導(dǎo)致程序僵死而不繼續(xù)往下執(zhí)行
  • HTTP正文的內(nèi)容是通過OutputStream流寫入,向流中寫入的數(shù)據(jù)不會(huì)立即發(fā)送到網(wǎng)絡(luò),而是存在于內(nèi)存緩沖區(qū)中,待流關(guān)閉時(shí),根據(jù)寫入的內(nèi)容生成HTTP正文。
  • 調(diào)用getInputStream()方法時(shí),會(huì)返回一個(gè)輸入流,用于從中讀取服務(wù)器對(duì)于HTTP請(qǐng)求的返回信息
  • 當(dāng)獲取HTTP響應(yīng)的時(shí)候,請(qǐng)求就會(huì)自動(dòng)的發(fā)起
  • 如使用HttpURLConnection.getInputStream()方法的時(shí)系統(tǒng)會(huì)自動(dòng)調(diào)用connect()方法
  • JDK8自帶的HttpURLConnection 默認(rèn)啟用keepAlive,支持HTTP / 1.1和HTTP / 1.0持久連接,使用后的HttpURLConnection會(huì)放入緩存中供以后的同host:port的請(qǐng)求重用底層socket在keepAlive超時(shí)之前不會(huì)關(guān)閉。
  • 當(dāng)在HttpURLConnection的header中加入Connection: close,則此連接不會(huì)啟用keepAlive如果想啟用keepAlive,程序請(qǐng)求完畢后必須調(diào)用HttpURLConnection.getInputStream().close()(此操作用于歸還長(zhǎng)連接給緩存,下次同host:port的請(qǐng)求重用底層socket連接),而不調(diào)用HttpURLConnection.disconnect()(表示關(guān)閉底層socket連接,不會(huì)啟用keepAlive)。

到此這篇關(guān)于Java HttpURLConnection使用方法與實(shí)例演示分析的文章就介紹到這了,更多相關(guān)Java HttpURLConnection使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java注解之Retention、Documented、Inherited介紹

    Java注解之Retention、Documented、Inherited介紹

    這篇文章主要介紹了Java注解之Retention、Documented、Inherited注解介紹,本文內(nèi)容和相關(guān)文章是系列文章,需要的朋友可以參考下
    2014-09-09
  • 初識(shí)JAVA數(shù)組

    初識(shí)JAVA數(shù)組

    java語言中,數(shù)組是一種最簡(jiǎn)單的復(fù)合數(shù)據(jù)類型。數(shù)組是有序數(shù)據(jù)的集合,數(shù)組中的每個(gè)元素具有相同的數(shù)據(jù)類型,可以用一個(gè)統(tǒng)一的數(shù)組名和下標(biāo)來唯一地確定數(shù)組中的元素。數(shù)組有一維數(shù)組和多維數(shù)組。
    2014-08-08
  • Spring中屬性注入詳解

    Spring中屬性注入詳解

    這篇文章主要為大家詳細(xì)介紹了Spring中屬性注入,演示了int、String、數(shù)組、list等屬性的注入,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • 深入理解Spring Boot屬性配置文件

    深入理解Spring Boot屬性配置文件

    這篇文章主要給大家深入的介紹了關(guān)于Spring Boot屬性配置文件的相關(guān)資料,文中介紹的很詳細(xì),相信對(duì)大家具有一定的參考借鑒價(jià)值,需要的朋友們下面來一起看看吧。
    2017-02-02
  • 使用maven項(xiàng)目pom.xml文件配置打包功能和靜態(tài)資源文件自帶版本號(hào)功能

    使用maven項(xiàng)目pom.xml文件配置打包功能和靜態(tài)資源文件自帶版本號(hào)功能

    在Maven項(xiàng)目中,通過pom.xml文件配置打包功能,可以控制構(gòu)建過程,生成可部署的包,同時(shí),為了緩存控制與版本更新,可以在打包時(shí)給靜態(tài)資源文件如JS、CSS添加版本號(hào),這通常通過插件如maven-resources-plugin實(shí)現(xiàn)
    2024-09-09
  • SpringCloud之服務(wù)注冊(cè)與發(fā)現(xiàn)Spring Cloud Eureka實(shí)例代碼

    SpringCloud之服務(wù)注冊(cè)與發(fā)現(xiàn)Spring Cloud Eureka實(shí)例代碼

    這篇文章主要介紹了SpringCloud之服務(wù)注冊(cè)與發(fā)現(xiàn)Spring Cloud Eureka實(shí)例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-04-04
  • 在Maven下代理服務(wù)器設(shè)定的方式

    在Maven下代理服務(wù)器設(shè)定的方式

    今天小編就為大家分享一篇關(guān)于在Maven下代理服務(wù)器設(shè)定的方式,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • Java使用Lambda表達(dá)式查找list集合中是否包含某值問題

    Java使用Lambda表達(dá)式查找list集合中是否包含某值問題

    Java使用Lambda表達(dá)式查找list集合中是否包含某值的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • SpringBoot接入釘釘自定義機(jī)器人預(yù)警通知

    SpringBoot接入釘釘自定義機(jī)器人預(yù)警通知

    本文主要介紹了SpringBoot接入釘釘自定義機(jī)器人預(yù)警通知,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • Java中文件管理系統(tǒng)FastDFS詳解

    Java中文件管理系統(tǒng)FastDFS詳解

    這篇文章主要介紹了Java中文件管理系統(tǒng)FastDFS詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07

最新評(píng)論

河曲县| 林周县| 普兰县| 昌都县| 民乐县| 聊城市| 确山县| 固阳县| 札达县| 通河县| 东辽县| 怀化市| 民勤县| 太原市| 胶南市| 嘉鱼县| 和田县| 乳山市| 巴青县| 奎屯市| 盘山县| 吴桥县| 通城县| 成武县| 通山县| 上杭县| 大渡口区| 山阴县| 光泽县| 获嘉县| 定兴县| 鹰潭市| 吉水县| 林芝县| 蚌埠市| 大连市| 芦山县| 新田县| 区。| 昆明市| 普定县|