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

一、注意事項html

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

若是okio架包偏低就會報錯;okhttp架包版本太低也會出現架包衝突;android

二、網上的例子:git

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());
  }

三、利用多線程以及CountDownLatch實現利用在後臺實現多線程http請求:github

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方法進行入口測試:web

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。apache

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

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

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

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資料任君挑選!

相關文章
相關標籤/搜索