日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

OkHttp学习

發布時間:2024/2/28 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 OkHttp学习 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、OkHttp 簡介

OkHttp 庫的設計和實現的首要目標是高效。這也是選擇 OkHttp 的重要理由之一。OkHttp 提供了對最新的 HTTP 協議版本 HTTP/2 和 SPDY 的支持,這使得對同一個主機發出的所有請求都可以共享相同的套接字連接。如果 HTTP/2 和 SPDY 不可用,OkHttp 會使用連接池來復用連接以提高效率。OkHttp 提供了對 GZIP 的默認支持來降低傳輸內容的大小。OkHttp 也提供了對 HTTP 響應的緩存機制,可以避免不必要的網絡請求。當網絡出現問題時,OkHttp 會自動重試一個主機的多個 IP 地址。

在 Java 程序中使用 OkHttp 非常簡單,只需要在 Maven 的 POM 文件中添加依賴即可

<dependency><groupId>com.squareup.okhttp</groupId><artifactId>okhttp</artifactId><version>3.6.0</version> </dependency>

二、HTTP 連接

雖然在使用 OkHttp 發送 HTTP 請求時只需要提供 URL 即可,OkHttp 在實現中需要綜合考慮 3 種不同的要素來確定與 HTTP 服務器之間實際建立的 HTTP 連接。這樣做的目的是為了達到最佳的性能。

首先第一個考慮的要素是 URL 本身。URL 給出了要訪問的資源的路徑。比如 URL?https://www.baidu.com?所對應的是百度首頁的 HTTP 文檔。在 URL 中比較重要的部分是訪問時使用的模式,即 HTTP 還是 HTTPS。這會確定 OkHttp 所建立的是明文的 HTTP 連接,還是加密的 HTTPS 連接。

第二個要素是 HTTP 服務器的地址,如 baidu.com。每個地址都有對應的配置,包括端口號,HTTPS 連接設置和網絡傳輸協議。同一個地址上的 URL 可以共享同一個底層 TCP 套接字連接。通過共享連接可以有顯著的性能提升。OkHttp 提供了一個連接池來復用連接。

第三個要素是連接 HTTP 服務器時使用的路由。路由包括具體連接的 IP 地址(通過 DNS 查詢來發現)和所使用的代理服務器。對于 HTTPS 連接還包括通訊協商時使用的 TLS 版本。對于同一個地址,可能有多個不同的路由。OkHttp 在遇到訪問錯誤時會自動嘗試備選路由。

當通過 OkHttp 來請求某個 URL 時,OkHttp 首先從 URL 中得到地址信息,再從連接池中根據地址來獲取連接。如果在連接池中沒有找到連接,則選擇一個路由來嘗試連接。嘗試連接需要通過 DNS 查詢來得到服務器的 IP 地址,也會用到代理服務器和 TLS 版本等信息。當實際的連接建立之后,OkHttp 發送 HTTP 請求并獲取響應。當連接出現問題時,OkHttp 會自動選擇另外的路由進行嘗試。這使得 OkHttp 可以自動處理可能出現的網絡問題。當成功獲取到 HTTP 請求的響應之后,當前的連接會被放回到連接池中,提供給后續的請求來復用。連接池會定期把閑置的連接關閉以釋放資源。

三、請求,響應與調用

HTTP 客戶端所要執行的任務很簡單,接受 HTTP 請求并返回響應。每個 HTTP 請求包括 URL,HTTP 方法(如 GET 或 POST),HTTP 頭和請求的主體內容等。HTTP 請求的響應則包含狀態代碼(如 200 或 500),HTTP 頭和響應的主體內容等。雖然請求和響應的交互模式很簡單,但在實現中仍然有很多細節要考慮。OkHttp 會對收到的請求進行一定的處理,比如增加額外的 HTTP 頭。同樣的,OkHttp 也可能在返回響應之前對響應做一些處理。例如,OkHttp 可以啟用 GZIP 支持。在發送實際的請求時,OkHttp 會加上 HTTP 頭 Accept-Encoding。在接收到服務器的響應之后,OkHttp 會先做解壓縮處理,再把結果返回。如果 HTTP 響應的狀態代碼是重定向相關的,OkHttp 會自動重定向到指定的 URL 來進一步處理。OkHttp 也會處理用戶認證相關的響應。

OkHttp 使用調用(Call)來對發送 HTTP 請求和獲取響應的過程進行抽象。下面代碼中給出了使用 OkHttp 發送 HTTP 請求的基本示例。首先創建一個 OkHttpClient 類的對象,該對象是使用 OkHttp 的入口。接著要創建的是表示 HTTP 請求的 Request 對象。通過 Request.Builder 這個構建幫助類可以快速的創建出 Request 對象。這里指定了 Request 的 url 為?http://www.baidu.com。接著通過 OkHttpClient 的 newCall 方法來從 Request 對象中創建一個 Call 對象,再調用 execute 方法來執行該調用,所得到的結果是表示 HTTP 響應的 Response 對象。通過 Response 對象中的不同方法可以訪問響應的不同內容。如 headers 方法來獲取 HTTP 頭,body 方法來獲取到表示響應主體內容的 ResponseBody 對象。

@Test public void test2() throws IOException {OkHttpClient client = new OkHttpClient();Request request = new Request.Builder().url("https://www.baidu.com").build();Response response = client.newCall(request).execute();if (!response.isSuccessful()) {throw new IOException("服務器端錯誤: " + response);}Headers responseHeaders = response.headers();for (int i = 0; i < responseHeaders.size(); i++) {System.out.println(responseHeaders.name(i) + ": " + responseHeaders.value(i));}System.out.println(response.body().string()); }

四、HTTP 頭處理

HTTP 頭是 HTTP 請求和響應中的重要組成部分。在創建 HTTP 請求時需要設置一些 HTTP 頭。在得到 HTTP 的響應之后,也會需要對其中包含的 HTTP 頭進行解析。從代碼的角度來說,HTTP 頭的數據結構是 Map<String, List<String>>類型。也就是說,對于每個 HTTP 頭,可能有多個值。但是大部分 HTTP 頭都只有一個值,只有少部分 HTTP 頭允許多個值。OkHttp 采用了簡單的方式來區分這兩種類型,使得對 HTTP 頭的使用更加簡單。

在設置 HTTP 頭時,使用 header(name, value) 方法來設置 HTTP 頭的唯一值。對同一個 HTTP 頭,多次調用該方法會覆蓋之前設置的值。使用 addHeader(name, value) 方法來為 HTTP 頭添加新的值。在讀取 HTTP 頭時,使用 header(name) 方法來讀取 HTTP 頭的最近出現的值。如果該 HTTP 頭只有單個值,則返回該值;如果有多個值,則返回最后一個值。使用 headers(name) 方法來讀取 HTTP 頭的所有值。

下面代碼中使用 header 方法設置了 User-Agent 頭的值,并添加了一個 Accept 頭的值。在進行解析時,通過 header 方法來獲取 Server 頭的單個值,通過 headers 方法來獲取 Set-Cookie 頭的所有值。

@Test public void test2() throws IOException {OkHttpClient client = new OkHttpClient();Request request = new Request.Builder().url("https://www.baidu.com").header("User-Agent", "My super agent").addHeader("Accept", "text/html").build();Response response = client.newCall(request).execute();if (!response.isSuccessful()) {throw new IOException("服務器端錯誤: " + response);}System.out.println(response.header("Server"));System.out.println(response.headers("Set-Cookie")); }

五、POST 請求

HTTP POST 和 PUT 請求可以包含要提交的內容。只需要在創建 Request 對象時,通過 post 和 put 方法來指定要提交的內容即可。下面代碼中通過 RequestBody 的 create 方法來創建媒體類型為 text/plain 的內容并提交。

@Test public void test7() throws IOException {OkHttpClient client = new OkHttpClient();RequestBody formBody = new FormEncodingBuilder().add("imei", "Hello").add("os", "os").build();Request request = new Request.Builder().url("http://www.baidu.com").post(formBody).build();Response response = client.newCall(request).execute();if (!response.isSuccessful()) {throw new IOException("服務器端錯誤: " + response);}System.out.println(response.body().string()); }

六、GET 請求

HTTP POST 和 PUT 請求可以包含要提交的內容。只需要在創建 Request 對象時,通過 post 和 put 方法來指定要提交的內容即可。下面代碼中通過 RequestBody 的 create 方法來創建媒體類型為 text/plain 的內容并提交。

@Test public void test7() throws IOException {OkHttpClient client = new OkHttpClient();Request request = new Request.Builder().url("http://www.baidu.com?aa=aa&bb=bb").build();Response response = client.newCall(request).execute();if (!response.isSuccessful()) {throw new IOException("服務器端錯誤: " + response);}System.out.println(response.body().string()); }

總結

以上是生活随笔為你收集整理的OkHttp学习的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。