一、注意事項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
他們還具體:每一個URL識別特定的路徑(如 /square/okhttp)和查詢(如 ?q=sharks&lang=en)。每一個Web服務器主機的網址。api
Addresses指定網絡服務器(如github.com)和全部的靜態必要的配置,以及鏈接到該服務器:端口號,HTTPS設置和首選的網絡協議(如HTTP / 2或SPDY)。
共享相同地址的URL也能夠共享相同的基礎TCP套接字鏈接。共享一個鏈接有實實在在的性能優勢:更低的延遲,更高的吞吐量(因爲TCP慢啓動)和保養電池。OkHttp使用的ConnectionPool自動重用HTTP / 1.x的鏈接和多樣的HTTP/ 2和SPDY鏈接。
在OkHttp地址的某些字段來自URL(scheme, hostname, port),其他來自OkHttpClient。
Routes提供鏈接到一個網絡服務器所必需的動態信息。就是嘗試特定的IP地址(如由DNS查詢發現),使用確切的代理服務器(若是一個特定的IP地址的ProxySelector在使用中)和協商的TLS版本(HTTPS鏈接)。
可能有單個地址對應多個路由。例如,在多個數據中心託管的Web服務器,它可能會在其DNS響應產生多個IP地址。
當你使用OkHttp進行一個URL請求時,下面是它的操做流程:
一旦響應已經被接收到,該鏈接將被返回到池中,以便它能夠在未來的請求中被重用。鏈接在池中閒置一段時間後,它會被趕出。
典型的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。若是沒有value,header(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資料任君挑選!