使用okhttp.jar;okio.jar用java實現http請求


1、注意事項

使用的jar為okio-1.9.0.jar和okhttp-3.8.0.jar;

如果okio架包偏低就會報錯;okhttp架包版本過低也會出現架包沖突;

2、網上的例子:

private final OkHttpClient client = new OkHttpClient();

  public void run() throws Exception {
    Request request = new Request.Builder()
        .url("http://publicobject.com/helloworld.txt")
        .build();

    Response response = client.newCall(request).execute();
    if (!response.isSuccessful()) throw new IOException("Unexpected code " + 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());
  }

3、利用多線程以及CountDownLatch實現利用在后台實現多線程http請求:

OkHttpClient   httpClient=new OkHttpClient();
        Request request=new Request.Builder()
                        .url(url)
                        .build();
        //得到response對象
        Response response=httpClient.newCall(request).execute();
        if(response.isSuccessful()){
            String result=response.body().string();
            System.out.println(response.code());
            System.out.println(response.message());
            System.out.println(result);
        }

使用main方法進行入口測試:

public static void main(String[] args) {
    CountDownLatch latch=new CountDownLatch(1);
    String url="http://test.meyki.net:9080/apidev/v3/goods/goodsList/eyJwYWdlU2l6ZSI6IjIwIiwib3MiOiJpb3MiLCJzaG9wSWQiOiI1MTU2MjNmNGVlOGU0OGIxYmU3MmY2MGFiOTcxZTExOSIsInVzZXJJZCI6IjIyNTg0MDVmYTU5ODRlOTViNWI2NTI4ZTM3YmExODBjIiwicGFnZU5vIjoiMSIsImlzU2hlbHZlcyI6IjEiLCJ2Y29kZSI6IjE0MCIsInRhZyI6IjEifQ==";
    for(int i=0;i<=15;i++){
        Thread thread=new Thread(new Mythread(latch,url));
        thread.start();
    }
    latch.countDown();
}

詳解:

2.1 OkHttp計划使用三種類型連接到你的web服務器:URL, Address, 和 Route。

URLs(如https://github.com/square/okhttp)是HTTP和因特網的基礎。除了是網絡上通用和分散的命名方案,他們還指定了如何訪問網絡資源。

URLs摘要:
  • 它們指定該呼叫(Call)可以被明文(HTTP)或加密的(HTTPS),但不指定用哪種加密算法。他們也不指定如何驗證對方的證書(HostnameVerifier)或證書可以信任(SSLSocketFactory)。
  • 他們不指定是否應使用特定的代理服務器或如何與該代理服務器進行身份驗證。

他們還具體:每個URL識別特定的路徑(如 /square/okhttp)和查詢(如 ?q=sharks&lang=en)。每個Web服務器主機的網址。

2.2 Addresses

Addresses指定網絡服務器(如github.com)和所有的靜態必要的配置,以及連接到該服務器:端口號,HTTPS設置和首選的網絡協議(如HTTP / 2SPDY)。

共享相同地址的URL也可以共享相同的基礎TCP套接字連接。共享一個連接有實實在在的性能優點:更低的延遲,更高的吞吐量(由於TCP慢啟動)和保養電池。OkHttp使用的ConnectionPool自動重用HTTP / 1.x的連接和多樣的HTTP/ 2和SPDY連接。

在OkHttp地址的某些字段來自URL(scheme, hostname, port),其余來自OkHttpClient

2.3 Routes

Routes提供連接到一個網絡服務器所必需的動態信息。就是嘗試特定的IP地址(如由DNS查詢發現),使用確切的代理服務器(如果一個特定的IP地址的ProxySelector在使用中)和協商的TLS版本(HTTPS連接)。

可能有單個地址對應多個路由。例如,在多個數據中心托管的Web服務器,它可能會在其DNS響應產生多個IP地址。

 

當你使用OkHttp進行一個URL請求時,下面是它的操作流程:

  1. 它使用URL和配置OkHttpClient創建一個address。此地址指定我們將如何連接到網絡服務器。
  2. 它通過地址從連接池中取回一個連接。
  3. 如果它沒有在池中找到連接,它會選擇route嘗試。這通常意味着使用一個DNS請求, 以獲取服務器的IP地址。如果需要,它會選擇一個的TLS版本和代理服務器。
  4. 如果它是一個新的route,它連接通過建立無論是直接的socket連接,socket連接使用TLS安全通道(用於HTTPS通過一個HTTP代理),或直接TLS連接。它的TLS握手是必要的。
  5. 它發送HTTP請求並讀取響應。
    如果有連接出現問題,OkHttp將選擇另一條route,然后再試一次。這帶來的好處是當一個服務器的地址的一個子集是不可達時,OkHttp能夠自動恢復。當連接池是過時或者試圖TLS版本不受支持時,這種方式是很有用的。

一旦響應已經被接收到,該連接將被返回到池中,以便它可以在將來的請求中被重用。連接在池中閑置一段時間后,它會被趕出。

 

 

3.3訪問頭

典型的HTTP頭工作就像一個Map<String, String> :每個字段都有一個值或無值。但是,一些頭部(headers)允許多個值,比如Guava的Multimap。例如,它共同為一個HTTP響應提供多個Vary頭。OkHttp的API,試圖使這兩種情況下都能舒適使用。

當寫請求頭,用header(name, value)來為唯一出現的name設置value。如果它本身存在值,在添加新的value之前,他們會被移除。使用addHeader(name, value)來添加頭部不需要移除當前存在的headers

當讀取響應頭,用header(name)返回最后設置name的value。如果沒有valueheader(name)將返回null。可以使用headers(name)來讀取所有列表字段的值,。

要訪問所有的頭部,用Headers類,它支持索引訪問。

 private final OkHttpClient client = new OkHttpClient();

  public void run() throws Exception {
    Request request = new Request.Builder()
        .url("https://api.github.com/repos/square/okhttp/issues")
        .header("User-Agent", "OkHttp Headers.java")
        .addHeader("Accept", "application/json; q=0.5")
        .addHeader("Accept", "application/vnd.github.v3+json")
        .build();

    Response response = client.newCall(request).execute();
    if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);

    System.out.println("Server: " + response.header("Server"));
    System.out.println("Date: " + response.header("Date"));
    System.out.println("Vary: " + response.headers("Vary"));
  }

OkHttpClient   httpClient=new OkHttpClient();

在創建不同的httpClient方法實現不同的操作;詳細請查看:

https://blog.csdn.net/jackingzheng/article/details/51778793#

 

關注公眾號,回復c+興趣的東西  24小時內即可領取學習。2T資料任君挑選!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM