日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

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

编程问答

OkHttp用法详解

發布時間:2023/12/29 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 OkHttp用法详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

OkHttp的基本使用

1、首先在工程的app模塊下添加okhttp的依賴

implementation 'com.squareup.okhttp3:okhttp:3.12.0'

同步GET請求

同步GET的意思是一直等待http請求, 直到返回了響應. 在這之間會阻塞進程, 所以通過get不能在Android的主線程中執行, 否則會報錯.

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

OkHttpClient實現了Call.Factory接口, 是Call的工廠類, Call負責發送執行請求和讀取響應.
Request代表Http請求, 通過Request.Builder輔助類來構建.client.newCall(request)通過傳入一個http request, 返回一個Call調用. 然后執行execute()方法, 同步獲得
Response代表Http請求的響應. response.body()是ResponseBody類, 代表響應體, 可以通過responseBody.string()獲得字符串的表達形式, 或responseBody.bytes()獲得字節數組的表達形式, 這兩種形式都會把文檔加入到內存. 也可以通過responseBody.charStream()和responseBody.byteStream()返回流來處理.

上述代碼完成的功能是下載一個文件, 打印他的響應頭, 以string形式打印響應體.
響應體的string()方法對于小文檔來說十分方便高效. 但是如果響應體太大(超過1MB), 應避免使用 string()方法, 因為它會將把整個文檔加載到內存中.
對于超過1MB的響應body, 應使用流的方式來處理響應body. 這和我們處理xml文檔的邏輯是一致的, 小文件可以載入內存樹狀解析, 大文件就必須流式解析.

異步GET

異步GET是指在另外的工作線程中執行http請求, 請求時不會阻塞當前的線程, 所以可以在Android主線程中使用.
下面是在一個工作線程中下載文件, 當響應可讀時回調Callback接口. 當響應頭準備好后, 就會調用Callback接口, 所以讀取響應體時可能會阻塞. OkHttp現階段不提供異步api來接收響應體。

//1.拿到okHttpClient對象,可以設置連接超時等OkHttpClient okHttpClient=new OkHttpClient();//2.構造Request請求對象,可以增加頭addHeader等Request.Builder builder = new Request.Builder();//url()中可以放入網址Request request = builder.get().url("http://publicobject.com/helloworld.txt").build();//3.將Request封裝為CallCall call = okHttpClient.newCall(request);//4.執行call//方法一Response response=call.execute();//匯拋出IO異常,同步方法//方法二,異步方法,放到隊列中,處于子線程中,無法更新UIcall.enqueue(new Callback() {//請求時失敗時調用@Overridepublic void onFailure(Call call, IOException e) {}//請求成功時調用@Overridepublic void onResponse(Call call, Response response) throws IOException {//處于子線程中,能夠進行大文件下載,但是無法更新UIfinal String res = response.body().string();//請求成功時返回的東西//InputStream is=response.body().byteStream();// 執行IO操作時,能夠下載很大的文件,并且不會占用很大內存/*** runOnUiThread方法切換到主線程中,或者用handler機制也可以*/runOnUiThread(new Runnable() {@Overridepublic void run() {// 更新ui}});}});

Post提交String

下面是使用HTTP POST提交請求到服務. 這個例子提交了一個json字符串到web服務. 因為整個請求體都在內存中, 因此避免使用此api提交大文檔(大于1MB)

OkHttpClient okHttpClient=new OkHttpClient();RequestBody requestBody = RequestBody.create(MediaType.parse("text/plain;charset=utf-8"), "{username:hyman,password:123}");Request.Builder builder = new Request.Builder();Request request = builder.url(mBaseUrl + "postString").post(requestBody).build();Call call = okHttpClient.newCall(request);//4.執行call//方法一Response response=call.execute();//匯拋出IO異常,同步方法//方法二,異步方法,放到隊列中,處于子線程中,無法更新UIcall.enqueue(new Callback() {//請求時失敗時調用@Overridepublic void onFailure(Call call, IOException e) {}//請求成功時調用@Overridepublic void onResponse(Call call, Response response) throws IOException {//處于子線程中,能夠進行大文件下載,但是無法更新UIfinal String res = response.body().string();//請求成功時返回的東西//InputStream is=response.body().byteStream();// 執行IO操作時,能夠下載很大的文件,并且不會占用很大內存/*** runOnUiThread方法切換到主線程中,或者用handler機制也可以*/runOnUiThread(new Runnable() {@Overridepublic void run() {// 更新ui}});}});

Post提交流

以流的方式POST提交請求體. 請求體的內容由流寫入產生. 這個例子是流直接寫入Okio的BufferedSink. 你的程序可能會使用OutputStream, 你可以使用BufferedSink.outputStream()來獲取. OkHttp的底層對流和字節的操作都是基于Okio庫, Okio庫也是Square開發的另一個IO庫, 填補I/O和NIO的空缺, 目的是提供簡單便于使用的接口來操作IO.

public static final MediaType MEDIA_TYPE_MARKDOWN= MediaType.parse("text/x-markdown; charset=utf-8");private final OkHttpClient client = new OkHttpClient();public void run() throws Exception {RequestBody requestBody = new RequestBody() {@Override public MediaType contentType() {return MEDIA_TYPE_MARKDOWN;}@Override public void writeTo(BufferedSink sink) throws IOException {sink.writeUtf8("Numbers\n");sink.writeUtf8("-------\n");for (int i = 2; i <= 997; i++) {sink.writeUtf8(String.format(" * %s = %s\n", i, factor(i)));}}private String factor(int n) {for (int i = 2; i < n; i++) {int x = n / i;if (x * i == n) return factor(x) + " × " + i;}return Integer.toString(n);}};Request request = new Request.Builder().url("https://api.github.com/markdown/raw").post(requestBody).build();Response response = client.newCall(request).execute();if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);System.out.println(response.body().string()); }

Post提交文件

File file = new File(Environment.getExternalStorageDirectory(), "banner.png");if (!file.exists()) {return;}//1.拿到okHttpClient對象OkHttpClient okHttpClient = new OkHttpClient();//mime typeRequestBody requestBody = RequestBody.create(MediaType.parse("application/octet-stream"), file);Request.Builder builder = new Request.Builder();Request request = builder.url(mBaseUrl + "postFile").post(requestBody).build();Call call = okHttpClient.newCall(request);//4.執行call//方法一Response response=call.execute();//匯拋出IO異常,同步方法//方法二,異步方法,放到隊列中,處于子線程中,無法更新UIcall.enqueue(new Callback() {//請求時失敗時調用@Overridepublic void onFailure(Call call, IOException e) {Log.d("報錯了嗎", "onFailure: 報了");e.printStackTrace();}//請求成功時調用@Overridepublic void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {//處于子線程中,能夠進行大文件下載,但是無法更新UILog.d("執行成功", "onResponse: 成功");final String res = response.body().string();//請求成功時返回的東西//InputStream is=response.body().byteStream();// 執行IO操作時,能夠下載很大的文件,并且不會占用很大內存/*** runOnUiThread方法切換到主線程中,或者用handler機制也可以*/runOnUiThread(new Runnable() {@Overridepublic void run() {// 更新ui}});}});

Post提交表單

使用FormEncodingBuilder來構建和HTML標簽相同效果的請求體. 鍵值對將使用一種HTML兼容形式的URL編碼來進行編碼.

//1.拿到okHttpClient對象OkHttpClient okHttpClient = new OkHttpClient();//2.構造Request請求對象//構造requestBody,get請求不需要FormBody.Builder requestBodyBuilder = new FormBody.Builder();//提交到服務器端的請求體RequestBody requestBody = requestBodyBuilder.add("username", "AI").add("password", "12345678").build();Request.Builder builder = new Request.Builder();Request request = builder.url(mBaseUrl + "login").post(requestBody).build();Call call = okHttpClient.newCall(request);//4.執行call//方法一Response response=call.execute();//匯拋出IO異常,同步方法//方法二,異步方法,放到隊列中,處于子線程中,無法更新UIcall.enqueue(new Callback() {//請求時失敗時調用@Overridepublic void onFailure(Call call, IOException e) {}//請求成功時調用@Overridepublic void onResponse(Call call, Response response) throws IOException {//處于子線程中,能夠進行大文件下載,但是無法更新UIfinal String res = response.body().string();//請求成功時返回的東西//InputStream is=response.body().byteStream();// 執行IO操作時,能夠下載很大的文件,并且不會占用很大內存/*** runOnUiThread方法切換到主線程中,或者用handler機制也可以*/runOnUiThread(new Runnable() {@Overridepublic void run() {// 更新ui}});}});

Post提交分塊請求

MultipartBody.Builder可以構建復雜的請求體, 與HTML文件上傳形式兼容. 多塊請求體中每塊請求都是一個請求體, 可以定義自己的請求頭. 這些請求頭可以用來描述這塊請求, 例如它的Content-Disposition. 如果Content-Length和Content-Type可用的話, 他們會被自動添加到請求頭中.

File file = new File(Environment.getExternalStorageDirectory(), "uz_splash_bg.png");if (!file.exists()) {return;}OkHttpClient okHttpClient=new OkHttpClient();//mime typeMultipartBody.Builder multipartBuilder = new MultipartBody.Builder();RequestBody requestBody = multipartBuilder.setType(MultipartBody.FORM).addPart(Headers.of("Content-Disposition", "form-data; name=\"" + "username" + "\""),RequestBody.create(null, "hyman")).addPart(Headers.of("Content-Disposition", "form-data; name=\"" + "password" + "\""),RequestBody.create(null, "123")).addFormDataPart("mPhoto", "hyman.png", RequestBody.create(MediaType.parse("application/octet-stream"), file)).build();//mPhoto是File的一個域,value//顯示上傳進度,把post的中的requestBody改為countingRequestBody就行了/**CountingRequestBody countingRequestBody=new CountingRequestBody(requestBody, new CountingRequestBody.Listener() {@Override public void onRequestProgress(long byteWritten, long contentLength) {L.e(byteWritten+"/"+contentLength);}});*/Request.Builder builder = new Request.Builder();Request request = builder.url(mBaseUrl + "uploadInfo").post(requestBody).build();Call call = okHttpClient.newCall(request);//4.執行call//方法一Response response=call.execute();//匯拋出IO異常,同步方法//方法二,異步方法,放到隊列中,處于子線程中,無法更新UIcall.enqueue(new Callback() {//請求時失敗時調用@Overridepublic void onFailure(Call call, IOException e) {}//請求成功時調用@Overridepublic void onResponse(Call call, Response response) throws IOException {//處于子線程中,能夠進行大文件下載,但是無法更新UIfinal String res = response.body().string();//請求成功時返回的東西//InputStream is=response.body().byteStream();// 執行IO操作時,能夠下載很大的文件,并且不會占用很大內存/*** runOnUiThread方法切換到主線程中,或者用handler機制也可以*/runOnUiThread(new Runnable() {@Overridepublic void run() {// 更新ui}});}});

設置響應頭和提取響應頭

典型的HTTP頭像是一個Map<String, String> : 每個字段都有一個或沒有值. 但是一些頭允許多個值, 像Guava的Multimap.
例如: HTTP響應里面提供的Vary響應頭, 就是多值的. OkHttp的api試圖讓這些情況都適用.
當寫請求頭的時候, 使用header(name, value)可以設置唯一的name、value. 如果已經有值, 舊的將被移除, 然后添加新的. 使用addHeader(name, value)可以添加多值(添加, 不移除已有的).
當讀取響應頭時, 使用header(name)返回最后出現的name、value. 通常情況這也是唯一的name、value. 如果沒有值, 那么header(name)將返回null. 如果想讀取字段對應的所有值, 使用headers(name)會返回一個list.
為了獲取所有的Header, Headers類支持按index訪問.

private final OkHttpClient client = new OkHttpClient();public void run() throws Exception {// 請求頭的設置// header()會覆蓋之前已設置的同名請求頭,而addHeader()不會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();try (Response response = client.newCall(request).execute()) {if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);// response.header(headerName)獲取的是響應頭對應字段的最新值System.out.println("Server: " + response.header("Server"));System.out.println("Date: " + response.header("Date"));// 獲取響應頭集合System.out.println("Vary: " + response.headers("Vary"));}}

使用Gson來解析JSON響應

Gson是一個在JSON和Java對象之間轉換非常方便的api庫. 這里我們用Gson來解析Github API的JSON響應.
注意: ResponseBody.charStream()使用響應頭Content-Type指定的字符集來解析響應體. 默認是UTF-8.

private final OkHttpClient client = new OkHttpClient();private final Gson gson = new Gson();public void run() throws Exception {Request request = new Request.Builder().url("https://api.github.com/gists/c2a7c39532239ff261be").build();Response response = client.newCall(request).execute();if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);Gist gist = gson.fromJson(response.body().charStream(), Gist.class);for (Map.Entry<String, GistFile> entry : gist.files.entrySet()) {System.out.println(entry.getKey());System.out.println(entry.getValue().content);}}static class Gist {Map<String, GistFile> files;}static class GistFile {String content;}

響應緩存

為了緩存響應, 你需要一個你可以讀寫的緩存目錄, 和緩存大小的限制. 這個緩存目錄應該是私有的, 不信任的程序應不能讀取緩存內容.
一個緩存目錄同時擁有多個緩存訪問是錯誤的. 大多數程序只需要調用一次new OkHttp(), 在第一次調用時配置好緩存, 然后其他地方只需要調用這個實例就可以了. 否則兩個緩存示例互相干擾, 破壞響應緩存, 而且有可能會導致程序崩潰.
響應緩存使用HTTP頭作為配置. 你可以在請求頭中添加Cache-Control: max-stale=3600 , OkHttp緩存會支持. 你的服務通過響應頭確定響應緩存多長時間, 例如使用Cache-Control: max-age=9600.

private final OkHttpClient client;public CacheResponse(File cacheDirectory) throws Exception {int cacheSize = 10 * 1024 * 1024; // 10 MiBCache cache = new Cache(cacheDirectory, cacheSize);client = new OkHttpClient();client.setCache(cache); }public void run() throws Exception {Request request = new Request.Builder().url("http://publicobject.com/helloworld.txt").build();Response response1 = client.newCall(request).execute();if (!response1.isSuccessful()) throw new IOException("Unexpected code " + response1);String response1Body = response1.body().string();System.out.println("Response 1 response: " + response1);System.out.println("Response 1 cache response: " + response1.cacheResponse());System.out.println("Response 1 network response: " + response1.networkResponse());Response response2 = client.newCall(request).execute();if (!response2.isSuccessful()) throw new IOException("Unexpected code " + response2);String response2Body = response2.body().string();System.out.println("Response 2 response: " + response2);System.out.println("Response 2 cache response: " + response2.cacheResponse());System.out.println("Response 2 network response: " + response2.networkResponse());System.out.println("Response 2 equals Response 1? " + response1Body.equals(response2Body)); }

如果需要阻值response使用緩存, 使用CacheControl.FORCE_NETWORK. 如果需要阻值response使用網絡, 使用CacheControl.FORCE_CACHE.
警告: 如果你使用FORCE_CACHE, 但是response要求使用網絡, OkHttp將會返回一個504 Unsatisfiable Request響應.

Force a Network Response

有些時候, 比如用戶剛剛點擊刷新按鈕, 這時必須跳過緩存, 直接從服務器抓取數據. 為了強制全面刷新, 我們需要添加no-cache指令:

connection.addRequestProperty("Cache-Control", "no-cache");

這樣就可以強制每次請求直接發送給源服務器, 而不經過本地緩存版本的校驗, 常用于需要確認認證的應用和嚴格要求使用最新數據的應用.

Force a Cache Response

有時你會想立即顯示資源. 這樣即使在后臺正下載著最新資源, 你的客戶端仍然可以先顯示原有資源, 畢竟有個東西顯示比沒有東西顯示要好.
如果需要限制讓請求優先使用本地緩存資源, 需要增加only-if-cached指令:

try {connection.addRequestProperty("Cache-Control", "only-if-cached");InputStream cached = connection.getInputStream();// the resource was cached! show itcatch (FileNotFoundException e) {// the resource was not cached} }

取消一個Call

使用Call.cancel()可以立即停止掉一個正在執行的call. 如果一個線程正在寫請求或者讀響應, 將會引發IOException. 當call沒有必要的時候, 使用這個api可以節約網絡資源. 例如當用戶離開一個應用時, 不管同步還是異步的call都可以取消.
你可以通過tags來同時取消多個請求. 當你構建一請求時, 使用RequestBuilder.tag(tag)來分配一個標簽, 之后你就可以用OkHttpClient.cancel(tag)來取消所有帶有這個tag的call.

private final ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);private final OkHttpClient client = new OkHttpClient();public void run() throws Exception {Request request = new Request.Builder().url("http://httpbin.org/delay/2") // This URL is served with a 2 second delay..build();final long startNanos = System.nanoTime();final Call call = client.newCall(request);// Schedule a job to cancel the call in 1 second.executor.schedule(new Runnable() {@Override public void run() {System.out.printf("%.2f Canceling call.%n", (System.nanoTime() - startNanos) / 1e9f);call.cancel();System.out.printf("%.2f Canceled call.%n", (System.nanoTime() - startNanos) / 1e9f);}}, 1, TimeUnit.SECONDS);try {System.out.printf("%.2f Executing call.%n", (System.nanoTime() - startNanos) / 1e9f);Response response = call.execute();System.out.printf("%.2f Call was expected to fail, but completed: %s%n",(System.nanoTime() - startNanos) / 1e9f, response);} catch (IOException e) {System.out.printf("%.2f Call failed as expected: %s%n",(System.nanoTime() - startNanos) / 1e9f, e);}}

超時

沒有響應時使用超時結束call. 沒有響應的原因可能是客戶點鏈接問題、服務器可用性問題或者這之間的其他東西. OkHttp支持連接超時, 讀取超時和寫入超時.

private final OkHttpClient client;public ConfigureTimeouts() throws Exception {client = new OkHttpClient.Builder().connectTimeout(10, TimeUnit.SECONDS).writeTimeout(10, TimeUnit.SECONDS).readTimeout(30, TimeUnit.SECONDS).build();}public void run() throws Exception {Request request = new Request.Builder().url("http://httpbin.org/delay/2") // This URL is served with a 2 second delay..build();Response response = client.newCall(request).execute();System.out.println("Response completed: " + response);}

每個call的配置

使用OkHttpClient, 所有的HTTP Client配置包括代理設置、超時設置、緩存設置. 當你需要為單個call改變配置的時候, 調用OkHttpClient.newBuilder(). 這個api將會返回一個builder, 這個builder和原始的client共享相同的連接池, 分發器和配置.
下面的例子中,我們讓一個請求是500ms的超時、另一個是3000ms的超時。
每一個Call(其實現是RealCall)只能執行一次,否則會報異常,具體參見 RealCall#execute()

private final OkHttpClient client = new OkHttpClient();public void run() throws Exception {Request request = new Request.Builder().url("http://httpbin.org/delay/1") // This URL is served with a 1 second delay..build();try {// Copy to customize OkHttp for this request.OkHttpClient copy = client.newBuilder().readTimeout(500, TimeUnit.MILLISECONDS).build();Response response = copy.newCall(request).execute();System.out.println("Response 1 succeeded: " + response);} catch (IOException e) {System.out.println("Response 1 failed: " + e);}try {// Copy to customize OkHttp for this request.OkHttpClient copy = client.newBuilder().readTimeout(3000, TimeUnit.MILLISECONDS).build();Response response = copy.newCall(request).execute();System.out.println("Response 2 succeeded: " + response);} catch (IOException e) {System.out.println("Response 2 failed: " + e);}}

處理驗證

這部分和HTTP AUTH有關.

HTTP AUTH

使用HTTP AUTH需要在server端配置http auth信息, 其過程如下:

  • 客戶端發送http請求
  • 服務器發現配置了http auth, 于是檢查request里面有沒有"Authorization"的http header
  • 如果有, 則判斷Authorization里面的內容是否在用戶列表里面, Authorization header的典型數據為"Authorization: Basic jdhaHY0=", 其中Basic表示基礎認證, jdhaHY0=是base64編碼的"user:passwd"字符串. 如果沒有,或者用戶密碼不對,則返回http code 401頁面給客戶端.
  • 標準的http瀏覽器在收到401頁面之后, 應該彈出一個對話框讓用戶輸入帳號密碼; 并在用戶點確認的時候再次發出請求, 這次請求里面將帶上Authorization header.
  • 一次典型的訪問場景是:

  • 瀏覽器發送http請求(沒有Authorization header)
  • 服務器端返回401頁面
  • 瀏覽器彈出認證對話框
  • 用戶輸入帳號密碼,并點確認
  • 瀏覽器再次發出http請求(帶著Authorization header)
  • 服務器端認證通過,并返回頁面
  • 瀏覽器顯示頁面
  • OkHttp認證

    OkHttp會自動重試未驗證的請求. 當響應是401 Not Authorized時,Authenticator會被要求提供證書. Authenticator的實現中需要建立一個新的包含證書的請求. 如果沒有證書可用, 返回null來跳過嘗試.
    使用Response.challenges()來獲得任何authentication challenges的 schemes 和 realms. 當完成一個Basic challenge, 使用Credentials.basic(username, password)來解碼請求頭.

    private final OkHttpClient client;public Authenticate() {client = new OkHttpClient.Builder().authenticator(new Authenticator() {@Override public Request authenticate(Route route, Response response) throws IOException {System.out.println("Authenticating for response: " + response);System.out.println("Challenges: " + response.challenges());String credential = Credentials.basic("jesse", "password1");return response.request().newBuilder().header("Authorization", credential).build();}}).build();}public void run() throws Exception {Request request = new Request.Builder().url("http://publicobject.com/secrets/hellosecret.txt").build();Response response = client.newCall(request).execute();if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);System.out.println(response.body().string());}

    當認證無法工作時, 為了避免多次重試, 你可以返回空來放棄認證. 例如, 當exact credentials已經嘗試過, 你可能會直接想跳過認證, 可以這樣做:

    if (credential.equals(response.request().header("Authorization"))) {return null; // If we already failed with these credentials, don't retry.}

    當重試次數超過定義的次數, 你若想跳過認證, 可以這樣做:

    if (responseCount(response) >= 3) {return null; // If we've failed 3 times, give up.}private int responseCount(Response response) {int result = 1;while ((response = response.priorResponse()) != null) {result++;}return result;}

    攔截器-interceptor

    OkHttp的攔截器鏈可謂是其整個框架的精髓,用戶可傳入的 interceptor 分為兩類:

    • ①一類是全局的 interceptor,該類 interceptor 在整個攔截器鏈中最早被調用,通過OkHttpClient.Builder#addInterceptor(Interceptor) 傳入;
    • ②另外一類是非網頁請求的 interceptor,這類攔截器只會在非網頁請求中被調用,并且是在組裝完請求之后,真正發起網絡請求前被調用,所有的 interceptor 被保存在List interceptors 集合中,按照添加順序來逐個調用,具體可參考RealCall#getResponseWithInterceptorChain() 方法。通過
      OkHttpClient.Builder#addNetworkInterceptor(Interceptor) 傳入;

    這里舉一個簡單的例子,例如有這樣一個需求,我要監控App通過 OkHttp 發出的所有原始請求,以及整個請求所耗費的時間,針對這樣的需求就可以使用第一類全局的 interceptor 在攔截器鏈頭去做。

    OkHttpClient okHttpClient = new OkHttpClient.Builder().addInterceptor(new LoggingInterceptor()).build(); Request request = new Request.Builder().url("http://www.publicobject.com/helloworld.txt").header("User-Agent", "OkHttp Example").build(); okHttpClient.newCall(request).enqueue(new Callback() {@Overridepublic void onFailure(Call call, IOException e) {Log.d(TAG, "onFailure: " + e.getMessage());}@Overridepublic void onResponse(Call call, Response response) throws IOException {ResponseBody body = response.body();if (body != null) {Log.d(TAG, "onResponse: " + response.body().string());body.close();}} }); public class LoggingInterceptor implements Interceptor {private static final String TAG = "LoggingInterceptor";@Overridepublic Response intercept(Chain chain) throws IOException {Request request = chain.request();long startTime = System.nanoTime();Log.d(TAG, String.format("Sending request %s on %s%n%s",request.url(), chain.connection(), request.headers()));Response response = chain.proceed(request);long endTime = System.nanoTime();Log.d(TAG, String.format("Received response for %s in %.1fms%n%s",response.request().url(), (endTime - startTime) / 1e6d, response.headers()));return response;} }

    針對這個請求,打印出來的結果

    Sending request http://www.publicobject.com/helloworld.txt on null User-Agent: OkHttp ExampleReceived response for https://publicobject.com/helloworld.txt in 1265.9ms Server: nginx/1.10.0 (Ubuntu) Date: Wed, 28 Mar 2018 08:19:48 GMT Content-Type: text/plain Content-Length: 1759 Last-Modified: Tue, 27 May 2014 02:35:47 GMT Connection: keep-alive ETag: "5383fa03-6df" Accept-Ranges: bytes

    注意到一點是這個請求做了重定向,原始的 request url 是 http://www.publicobject.com/helloworld.tx,而響應的 request url 是 https://publicobject.com/helloworld.txt,這說明一定發生了重定向,但是做了幾次重定向其實我們這里是不知道的,要知道這些的話,可以使用 addNetworkInterceptor()去做。更多的關于 interceptor的使用以及它們各自的優缺點,請移步OkHttp Interceptors 攔截器

    自定義dns服務

    Okhttp默認情況下使用的是系統

    其他

    推薦讓 OkHttpClient 保持單例,用同一個 OkHttpClient 實例來執行你的所有請求,因為每一個 OkHttpClient 實例都擁有自己的連接池和線程池,重用這些資源可以減少延時和節省資源,如果為每個請求創建一個 OkHttpClient 實例,顯然就是一種資源的浪費。當然,也可以使用如下的方式來創建一個新的 OkHttpClient 實例,它們共享連接池、線程池和配置信息。

    OkHttpClient eagerClient = client.newBuilder().readTimeout(500, TimeUnit.MILLISECONDS).build();Response response = eagerClient.newCall(request).execute();

    資源釋放

    OkHttp中被掛起的線程和連接都將會在保持空閑時自動回收。如果我們想要主動釋放資源,可以使用如下方式,之后所有的Call對象執行請求都將被拒絕。

    client.dispatcher().executorService().shutdown();

    清理連接池可以使用如下方式(連接池的守護線程可能不會立即退出):

    client.connectionPool().evictAll();

    如果希望關閉緩存,可以使用如下方式:

    client.cache().close();

    補充一點

    MediaType媒體類型:決定瀏覽器將以什么形式、什么編碼對資源進行解析

    Content-Type:也屬于MediaType媒體類型,主要用于在請求頭中指定資源的MediaType
    一、MediaType類型
    類型 描述
    text/html HTML格式
    text/plain 純文本格式,空格轉換為 “+” 加號,但不對特殊字符編碼
    text/xml XML格式
    text/x-markdown Markdown格式
    image/gif gif圖片格式
    image/jpeg jpg圖片格式
    image/png png圖片格式
    application/xhtml+xml XHTML格式
    application/xml XML數據格式
    application/json 用來告訴服務端,消息主體是序列化后的JSON字符串
    application/pdf pdf格式
    application/msword Word文檔格式
    application/octet-stream 二進制流數據(如常見的文件下載)
    application/x-www-form-urlencoded 參數為鍵值對形式,在發送前編碼所有字符(默認)。瀏覽器的原生 <form encType=”” 表單提交類型,如果不設置 enctype 屬性,那么最終就會以 application/x-www-form-urlencoded 方式提交數據
    multipart/form-data 不對字符編碼,發送大量二進制數據或包含non-ASCII字符的文本,application/x-www-form-urlencoded是效率低下的(需要用更多字符表示一個non-ASCII字符)。需要設定“ <form enctype=‘multipart/form-data’”

    二、MediaType對象解析

    MediaType對象包含了三種信息:type 、subtype、charset,一般將這些信息傳入parse()方法中,這樣就可以解析出MediaType對象

    例子1:

    text/x-markdown; charset=utf-8

    type值是text,表示是文本這一大類;
    / 后面的x-markdown是subtype,表示是文本這一大類下的markdown這一小類;
    charset=utf-8 則表示采用UTF-8編碼

    參考文章
    Android OkHttp完全解析 是時候來了解OkHttp了
    OkHttp使用教程
    okhttp3使用總結
    Okhttp3基本使用
    OkHttp使用完全教程

    總結

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

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

    午夜精品福利一区二区三区蜜桃 | 一级黄色片网站 | 亚洲成av人影院 | 国产福利午夜 | 国产麻豆成人传媒免费观看 | 久久免费99 | 伊人天天综合 | 免费视频97| 欧美日韩不卡一区二区 | 久久精品第一页 | 中文字幕一区二区三区视频 | 精品黄色在线观看 | 国产一区欧美二区 | av在线播放亚洲 | 欧美激情精品久久久久久免费 | 天天插狠狠插 | 在线免费观看av网站 | 免费av 在线 | 亚洲午夜久久久久久久久久久 | www.91av在线| 涩五月婷婷| 中文字幕高清 | 亚洲国产精品一区二区久久hs | 亚洲欧美视频在线观看 | 天天操天天透 | 日韩免费成人av | 日韩av影片在线观看 | 日韩3区| av在线免费在线 | 精品一区二区在线免费观看 | 国产日本在线观看 | 99久久久国产精品免费观看 | 日本久久成人中文字幕电影 | 成人精品福利 | 国产精品va最新国产精品视频 | 国产视频精品在线 | 在线观看免费福利 | 日韩精品中文字幕在线不卡尤物 | 免费国产在线视频 | 国产 欧美 在线 | 久久视频免费观看 | 亚洲精品国偷拍自产在线观看 | 超碰电影在线观看 | 97视频资源 | 麻豆国产露脸在线观看 | 成人小视频在线播放 | 国产女人免费看a级丨片 | 欧美超碰在线 | 九热在线 | 精品国产一区二区三区久久久蜜臀 | 日韩影片在线观看 | 精品欧美一区二区精品久久 | 国产群p视频 | 精品久久国产一区 | 91精品视频免费看 | 国产亚洲视频在线观看 | 国产麻豆剧果冻传媒视频播放量 | 成人在线视频一区 | 久久综合九色九九 | 天天射狠狠干 | 欧美最爽乱淫视频播放 | 六月天综合网 | 国产精品剧情 | 91精品在线播放 | 日韩在线视频观看 | 国产视频精品久久 | 91porny九色在线播放 | av福利资源 | 91av色| 欧美日比视频 | 婷婷亚洲五月 | 天天性天天草 | 日韩手机在线 | 国产69精品久久久久9999apgf | 91成人精品一区在线播放69 | 狠狠操狠狠干2017 | 久久久久久视频 | 福利视频区 | 国产福利91精品一区二区三区 | 国产免费成人av | 国产高清久久久 | 久久夜夜操 | 日韩视频一区二区三区 | 亚洲精品在线网站 | 国产精品黄网站在线观看 | 最近中文字幕在线中文高清版 | 91av蜜桃| av在线影片 | 91麻豆精品国产91久久久无需广告 | 色婷婷激婷婷情综天天 | 亚洲区另类春色综合小说校园片 | 最近中文字幕mv | 91麻豆操 | 亚洲我射av| 九九在线视频 | 亚洲 中文字幕av | 日韩av伦理片 | 亚洲国产精品久久 | 久久激情片 | ww视频在线观看 | 久久精品国亚洲 | 国产原创在线视频 | 欧美一级日韩免费不卡 | www国产亚洲精品久久网站 | 天天干天天色2020 | 日韩一区在线播放 | 中文字幕在线观看视频一区二区三区 | 国产精品第一页在线观看 | 美女国产网站 | 欧美aa级 | 99精品久久久久久久久久综合 | 97国产情侣爱久久免费观看 | 99精品视频在线观看 | 在线视频一区观看 | 热re99久久精品国产66热 | 美女视频是黄的免费观看 | 最近高清中文字幕 | 高清有码中文字幕 | 玖玖在线播放 | 亚洲成人资源在线 | 18做爰免费视频网站 | 97视频人人免费看 | 日韩在线观看视频免费 | 国产一区麻豆 | www黄com| 成人黄色电影在线播放 | 97免费在线观看视频 | 黄网站app在线观看免费视频 | 天天摸夜夜操 | 日韩精品电影在线播放 | 中文免费观看 | 人人爽人人爽人人 | 亚洲欧洲国产精品 | 免费三及片 | 狠狠操狠狠插 | 色欧美88888久久久久久影院 | www..com毛片| 五月天久久综合 | av福利在线 | 狠狠操狠狠干2017 | 久久a久久| 丁香电影小说免费视频观看 | 91爱在线| 久草影视在线观看 | 久久精品一区二区 | 蜜臀av性久久久久av蜜臀三区 | 中文字幕永久在线 | av日韩国产 | 亚洲综合网 | 综合五月| 国产香蕉视频 | av不卡在线看 | 免费看片成年人 | 国产免费亚洲 | 在线观看的av | 成 人 免费 黄 色 视频 | 日韩中文字幕免费在线播放 | 一本一本久久a久久精品综合小说 | 九色91av| 亚洲精品在线资源 | 国产精品伦一区二区三区视频 | 天天色视频 | 国产精品ⅴa有声小说 | 成人午夜电影在线观看 | 91免费黄视频| 天天干天天看 | 波多野结衣亚洲一区二区 | 久久久精品在线观看 | 美女久久网站 | 在线观看www视频 | 久热电影 | 久久99久久久久久 | 国产极品尤物在线 | 日本三级国产 | 91.dizhi永久地址最新 | 久久精品国产免费 | 久久久久久久久久网 | 中文字幕网站视频在线 | 国产精品黑丝在线观看 | 日韩资源在线播放 | 日韩精品在线观看视频 | a黄色片在线观看 | 亚洲国产字幕 | 久久成人综合 | 亚洲影院一区 | 亚洲精品 在线视频 | 亚洲 欧美 另类人妖 | av福利在线免费观看 | 亚洲黄色在线播放 | 国产精品av在线免费观看 | 日韩电影精品一区 | 五月天亚洲综合 | 五月激情丁香图片 | 免费高清男女打扑克视频 | 国产成人久久av免费高清密臂 | 久草影视在线观看 | 91丨九色丨蝌蚪丨老版 | 亚洲精品1区2区3区 超碰成人网 | 国产精品久久久久亚洲影视 | 亚洲国产精品久久久久 | 久九视频 | 91高清在线| 日韩视频精品在线 | 国产尤物视频在线 | 亚洲精品一区二区久 | 久久伊人八月婷婷综合激情 | 天天干天天摸天天操 | 人人澡人人添人人爽一区二区 | 欧美另类v | 久久人人爽人人爽人人片av免费 | 亚洲欧美视频在线观看 | 国产一级片久久 | 中文免费在线观看 | www99精品| 日韩免费大片 | 高清国产午夜精品久久久久久 | 中日韩男男gay无套 日韩精品一区二区三区高清免费 | 国产成人久久精品77777 | 欧美片网站yy | 国产丝袜美腿在线 | 国产精品一区免费观看 | 99精品国产亚洲 | 久久国产亚洲 | 丁香六月久久综合狠狠色 | www色,com| 波多野结衣精品在线 | 国内精品久久久久久久久久久 | 亚洲综合色网站 | 午夜国产福利视频 | 97超碰人人爱 | 亚洲欧美综合精品久久成人 | 免费日韩电影 | 中文理论片| 精品国自产在线观看 | 亚洲五月综合 | 午夜三级福利 | 午夜精品久久久久99热app | 亚洲精品欧洲精品 | 最新国产在线视频 | 午夜视频色 | 久久久亚洲精华液 | 成人9ⅰ免费影视网站 | 香蕉视频亚洲 | 国产精品99免费看 | 欧美亚洲久久 | 经典三级一区 | 狠狠插狠狠操 | av资源在线看 | 亚洲美女视频在线观看 | 一区二精品 | 97爱爱爱 | 97在线观看视频 | 亚洲美女视频在线观看 | 欧美va电影 | 欧美色图亚洲图片 | 精品国产精品一区二区夜夜嗨 | 热久久这里只有精品 | 色欧美88888久久久久久影院 | 国产精品99久久久久久久久久久久 | 国产黄在线播放 | 2019中文在线观看 | 四虎国产精品成人免费影视 | 日韩精品极品视频 | 人人射| av福利在线导航 | 视频一区二区精品 | 亚洲精色 | 免费在线观看中文字幕 | 亚洲影音先锋 | av黄色在线观看 | 亚洲精品视频播放 | 东方av在线免费观看 | 国内精品视频免费 | 日韩在线观看影院 | 中文字幕国产在线 | 日韩网页 | 99视频在线精品国自产拍免费观看 | 亚洲无在线| 欧美日bb| 日韩网站中文字幕 | 中文字幕国产精品一区二区 | 久久好看免费视频 | 中文字幕色播 | www日| 在线观看视频免费播放 | 亚洲1区 在线 | 婷婷色站 | 成人av免费看 | 波多野结衣电影一区二区三区 | 91网在线看| 在线观看亚洲a | 三上悠亚一区二区在线观看 | 久久久www成人免费毛片麻豆 | 一区二区av | 啪啪av在线 | 999在线视频 | 日韩欧美一区视频 | 久久久久北条麻妃免费看 | 最新超碰在线 | 久草在线视频免赞 | 中文日韩在线视频 | www.久久爱.cn| 久久国产精品99国产 | 狠狠色丁香婷婷综合久小说久 | 亚洲一区在线看 | 国产a精品 | 在线观看黄色国产 | 天天艹天天 | 婷婷五月色综合 | 亚州国产精品久久久 | 久久精品综合网 | 去看片 | 日韩欧美一区二区在线播放 | 麻豆视频免费入口 | 蜜臀av夜夜澡人人爽人人 | 欧美一级性生活片 | 免费91在线观看 | 欧美一级看片 | www天天操 | 国产成人性色生活片 | 久久免费a | 中文字幕乱码日本亚洲一区二区 | 日韩v在线91成人自拍 | 欧美视频二区 | 久久精品99国产精品酒店日本 | 91av电影在线| 在线成人免费电影 | 成年人视频在线免费播放 | 在线视频精品播放 | 一本一本久久a久久精品综合妖精 | 日本不卡一区二区三区在线观看 | 午夜在线日韩 | 欧美aa级 | 亚洲日本在线一区 | 国产色综合天天综合网 | 中文字幕无吗 | 黄色三级免费观看 | 操操操人人人 | 欧美国产日韩一区二区三区 | 亚洲丝袜一区 | 国产精品资源在线 | 国产精品美女久久久久久久网站 | 午夜精品福利一区二区三区蜜桃 | 亚洲黄色网络 | 亚洲精品国产精品久久99热 | 91在线视频免费91 | 六月丁香在线视频 | 97色婷婷成人综合在线观看 | 亚欧洲精品视频在线观看 | 精品久久久久久久 | 久久女同性恋中文字幕 | 激情视频一区二区三区 | 精品国产成人av | 国产精品一区二区三区在线 | 国产一线天在线观看 | 国产手机视频在线观看 | 国产高清在线永久 | 又黄又爽又刺激 | 欧美另类调教 | 日韩视频一二三区 | 最近中文字幕大全中文字幕免费 | 国产不卡网站 | 国产视频日韩视频欧美视频 | 激情五月婷婷丁香 | 在线精品国产 | 中文字幕在线观看av | 伊人看片 | 国产精品 亚洲精品 | 四虎永久免费在线观看 | 黄色软件视频网站 | 视频在线99| 国产美女精品视频 | 日韩欧美国产激情在线播放 | 久久你懂的 | 狠狠色狠狠色综合日日92 | 国产精品成人国产乱 | 成年人看片网站 | 久久久久久久久久久久久久电影 | 久久免费99 | 天天久久综合 | 国产三级精品在线 | 午夜精品久久久久久久久久久 | 亚洲一区二区精品 | 日韩三级视频在线观看 | 久日视频 | 亚洲国产精品va在线看 | 日产乱码一二三区别在线 | 国产麻豆精品久久一二三 | www.久久精品视频 | 狠狠躁日日躁狂躁夜夜躁 | 日韩在线三级 | 在线观看亚洲精品视频 | 日韩成人中文字幕 | 欧美一二三在线 | 在线观看91精品视频 | 欧美一级在线看 | 激情影音 | 日韩欧美视频一区二区三区 | 日本久久高清视频 | 久久久久女人精品毛片 | 精品国产一二三四区 | 五月天亚洲婷婷 | 欧美视频国产视频 | 国产精品videossex国产高清 | 热久在线| 四虎永久网站 | 黄a网站| 2023天天干 | 久久久国产精华液 | 亚洲天天摸日日摸天天欢 | 亚洲欧美视频在线 | 亚洲日本欧美在线 | 久久综合九色综合欧美就去吻 | 亚洲精品免费看 | 美女网站视频一区 | 久久96| 中文字幕乱码亚洲精品一区 | 国产日韩欧美自拍 | 国产精品99久久久久久人免费 | 成人动态视频 | 在线免费高清视频 | 欧美精品乱码久久久久 | 国产在线播放一区二区三区 | 亚洲一区二区精品在线 | 亚州天堂 | 午夜久久久久久久 | 美女国产在线 | www.黄色小说.com | 天操夜夜操 | 可以免费看av | 日韩r级电影在线观看 | 激情影院在线观看 | 国产一区二区精品久久 | 婷婷久久综合网 | 18+视频网站链接 | 久久99精品久久久久婷婷 | 欧美日韩午夜 | 中文字幕精品三级久久久 | 色噜噜狠狠狠狠色综合 | 成人久久亚洲 | 黄色免费高清视频 | 日韩欧美在线中文字幕 | 久久99精品国产麻豆婷婷 | 亚洲无吗天堂 | 1000部国产精品成人观看 | 91av精品 | 91视频大全| 伊香蕉大综综综合久久啪 | 深夜激情影院 | 婷婷丁香自拍 | 五月天中文字幕mv在线 | 久久久久久福利 | 国产免费久久久久 | 在线播放你懂 | 98福利在线 | 日本资源中文字幕在线 | 五月导航 | 极品久久久久 | 国产精品午夜久久 | 国产精品婷婷午夜在线观看 | 91 中文字幕 | 狠狠操天天射 | 五月天久久 | 亚洲精品视频在线观看免费视频 | 精品美女在线观看 | 色插综合 | 香蕉视频在线网站 | 欧美在线18 | 国产原创中文在线 | 亚洲乱码国产乱码精品天美传媒 | 91av网址 | 日韩中字在线观看 | 久久久国产影院 | 免费在线成人av电影 | 人人爱夜夜操 | 500部大龄熟乱视频 欧美日本三级 | 日日夜夜狠狠干 | 天天夜夜亚洲 | 国产资源精品在线观看 | 超薄丝袜一二三区 | 亚洲少妇自拍 | 国产在线91在线电影 | 国产精品久久久久aaaa | 男女全黄一级一级高潮免费看 | 欧洲精品一区二区 | 欧美一级黄色网 | 欧美男男tv网站 | 欧美日韩在线观看一区二区三区 | 日本三级在线观看中文字 | 婷婷亚洲激情 | 欧美一级专区免费大片 | 综合黄色网 | 美女福利视频在线 | 成人毛片在线观看 | 丁香五婷| 欧美日韩精品国产 | 日韩欧美一区二区三区免费观看 | 在线观看视频在线观看 | 国产亚洲精品久久久网站好莱 | 人人爽人人澡人人添人人人人 | 在线成人观看 | 2019天天干天天色 | 97在线播放视频 | 中文字幕首页 | 欧美肥妇free| 一级黄色片在线观看 | 欧美大片第1页 | 国产成人精品一区二区三区免费 | 婷婷久草| 人人看人人做人人澡 | japanese黑人亚洲人4k | 狠狠插天天干 | 黄在线免费观看 | 久久午夜国产 | 欧美激情综合五月色丁香 | 国产不卡免费av | 天天做日日做天天爽视频免费 | 色综合久久久久久中文网 | 91手机电视 | 精品视频在线免费观看 | 黄色毛片大全 | 激情久久久 | 三级免费黄色 | 亚洲精品资源在线观看 | 国产美女网 | 日韩免费不卡视频 | 午夜视频在线观看欧美 | 91激情视频在线播放 | 黄色影院在线免费观看 | 五月天电影免费在线观看一区 | 国产精品一二三 | 一区二区视频免费在线观看 | 九九久久久久久久久激情 | 中文字幕在线观看第二页 | 成人影片在线播放 | 黄色电影在线免费观看 | 中文字幕日本在线 | 特级西西444www大胆高清无视频 | 狠狠色噜噜狠狠 | 精品一区二区精品 | 综合国产在线观看 | 国产精品久久久久久久免费大片 | 欧美日韩一区二区三区视频 | 四虎影视8848dvd | 中国一级特黄毛片大片久久 | 欧美视频国产视频 | 国产麻豆精品久久一二三 | 国产亚洲免费的视频看 | 一级免费片 | 色黄久久久久久 | 日本黄区免费视频观看 | 中文字幕免 | 国产一区久久 | 欧美日韩精品久久久 | 99视频黄| 久久久久一区二区三区 | 麻豆观看 | 99999精品视频 | 国产精品理论在线观看 | 亚洲一区 影院 | 久久这里只有精品久久 | 激情五月看片 | 精品国产99国产精品 | 国产精品久久久久久久午夜片 | 欧美日韩p片 | 9i看片成人免费看片 | 高清国产在线一区 | 中文字幕中文字幕在线中文字幕三区 | 国产在线看一区 | 激情综合网天天干 | 国产高清在线 | 永久av免费在线观看 | 蜜桃麻豆www久久囤产精品 | 午夜12点 | 亚洲国产精品久久久久久 | 国产黄色a | 成人免费视频播放 | 日韩在线视 | 日日夜夜婷婷 | 中文字幕电影一区 | 久久精品视频网 | 久久一区二区三区国产精品 | 美女视频永久黄网站免费观看国产 | 天天色天天 | 国产精品久久久精品 | 久久毛片网站 | 婷婷丁香久久五月婷婷 | 丁香五婷 | 亚洲精品国精品久久99热 | 99一区二区三区 | 婷婷福利影院 | 色综合五月 | 国产精品九九九 | 日本少妇高清做爰视频 | 婷婷丁香久久五月婷婷 | 色播亚洲婷婷 | 国产 字幕 制服 中文 在线 | 色91在线 | 精品美女久久久久久免费 | 色综合久久网 | 成人免费观看完整版电影 | www.色爱| 天天夜夜亚洲 | 91中文字幕在线视频 | 色综合久久久久综合体桃花网 | 久久国产精品第一页 | 欧美午夜精品久久久久 | 国产精品国产三级国产aⅴ无密码 | 亚洲精品视频一 | 97在线影院 | 99久热在线精品 | 婷婷资源站 | 日本久久综合视频 | 91传媒在线播放 | 婷婷5月色 | 国产男女爽爽爽免费视频 | 黄色三级网站在线观看 | 18+视频网站链接 | 久久这里只有精品视频首页 | 午夜视频在线瓜伦 | 一级黄色片在线 | 开心激情网五月天 | 四虎国产精品成人免费4hu | 奇米影视8888在线观看大全免费 | 中文字幕乱在线伦视频中文字幕乱码在线 | www夜夜操com| 国产黑丝一区二区 | 国产精品一区二区精品视频免费看 | 久久线视频 | 成人在线播放av | 人人狠狠综合久久亚洲婷 | 九九热在线视频免费观看 | 日韩免费一级a毛片在线播放一级 | 日韩天堂网 | 成人欧美日韩国产 | 午夜美女视频 | 麻豆传媒一区二区 | 色婷婷狠狠五月综合天色拍 | 亚洲精品视频在线观看免费视频 | 国产麻豆剧传媒免费观看 | 韩国av免费在线 | 99re国产 | 一级黄色免费 | 欧美精品v国产精品v日韩精品 | 久久久久久久久久福利 | 一本一道久久a久久精品 | 日韩av一区二区三区四区 | 国产一级精品在线观看 | 亚洲在线国产 | 香蕉久草在线 | 欧美日韩精品在线免费观看 | 日韩成人中文字幕 | 久久99国产精品二区护士 | 国产91精品高清一区二区三区 | 久久久久成人精品 | 久久天堂亚洲 | 日日干美女| 97视频在线看| 黄色网大全 | 一区二区中文字幕在线 | 久久成人在线视频 | 国产精品欧美一区二区三区不卡 | 亚洲电影av在线 | 91中文在线 | 99精品一级欧美片免费播放 | 18做爰免费视频网站 | 黄色小说免费在线观看 | 五月婷婷在线综合 | 精品久久久久久一区二区里番 | 日韩精品一区二区三区第95 | 日本99干网| 天天干.com| 久久久精品欧美 | 日韩经典一区二区三区 | 国产999精品久久久久久绿帽 | 国产日产精品久久久久快鸭 | 久久综合综合久久综合 | 999亚洲国产996395 | 91精品久久久久久久91蜜桃 | 少妇bbb好爽 | 欧美a√大片 | 欧美最猛性xxxx | 亚洲精品永久免费视频 | 在线观看国产区 | 欧美三级在线播放 | 99超碰在线观看 | 久久人人爽人人爽 | 久久久久久久综合色一本 | 天天爽天天爽天天爽 | 九九九九九九精品 | 日日操狠狠干 | 亚洲精品播放 | 四虎在线观看网址 | 国产在线观看 | 亚洲欧美婷婷六月色综合 | 久热精品国产 | 91香蕉视频 | 丁香视频在线观看 | 国产精品乱码一区二区视频 | 丁香婷婷综合五月 | 国内精品久久久久久久影视麻豆 | 久久国内精品 | 999超碰 | 久久婷婷精品视频 | 精品视频在线免费观看 | 精品国产自在精品国产精野外直播 | 午夜丁香网 | 99热官网 | 久久久久久久免费看 | 国产一区观看 | 精品国产一区二区三区不卡 | 精品国产诱惑 | 一级a性色生活片久久毛片波多野 | 又黄又爽的免费高潮视频 | 五月婷婷播播 | 国产精品久久综合 | 91九色精品国产 | 精品久久国产一区 | 中文字幕av在线不卡 | 国产美腿白丝袜足在线av | 久久婷婷激情 | 久久神马影院 | 丁香五月网久久综合 | 超碰成人免费电影 | 久久久www| 久久国产影院 | 丁香午夜婷婷 | 国产福利91精品一区二区三区 | 91看片看淫黄大片 | 成人影片在线播放 | 99久久99久久精品国产片果冰 | 亚洲国产精品久久久久 | 97电影院网 | 91在线资源 | 国产精品国产三级国产aⅴ入口 | 日韩一级电影在线 | 亚洲一级特黄 | 国内小视频在线观看 | 首页av在线 | 日韩黄色一区 | 国产精品第一视频 | 久草在线免费看视频 | 成人h动漫精品一区二 | 久久综合久久伊人 | 国产香蕉在线 | 在线视频 国产 日韩 | 99日精品| 欧美午夜视频在线 | 中文字幕资源在线观看 | 国产成人精品一区二区三区免费 | 五月婷婷在线视频观看 | 97成人在线免费视频 | 国内精品99| 毛片视频电影 | 日韩一级黄色大片 | 欧美a免费| 黄色av一级 | 欧美与欧洲交xxxx免费观看 | 在线观看亚洲精品视频 | 91精品国产自产老师啪 | 欧美日产一区 | 91久久国产露脸精品国产闺蜜 | 日韩,精品电影 | 国产69精品久久久久久久久久 | 国产精品一区一区三区 | 久久综合毛片 | 丁香六月激情婷婷 | 在线免费观看视频 | 片黄色毛片黄色毛片 | 国产高清一区二区 | 日韩资源在线播放 | 国内精品视频在线播放 | 国产精品99久久久久 | 韩国av免费看 | 色资源在线观看 | 免费视频成人 | 丁香在线观看完整电影视频 | 91av视屏 | 粉嫩av一区二区三区四区在线观看 | 国产97在线看 | 香蕉影视 | 免费观看一区二区三区视频 | 亚洲精品一区二区三区新线路 | 久草在线资源观看 | 亚洲精品三级 | 激情综合五月婷婷 | 99精品国产一区二区三区不卡 | 久久69av| 国产高清日韩欧美 | 亚洲一区二区三区91 | 91污在线| 免费成人在线观看 | 国产真实精品久久二三区 | 色丁香综合 | 久久精品国产一区二区电影 | 午夜久久久影院 | 成人毛片在线视频 | 国产黄色一级片 | 69精品在线 | 成人黄色大片在线免费观看 | 免费男女羞羞的视频网站中文字幕 | 最新av电影网址 | 亚洲另类视频在线观看 | www久久国产 | 一区免费视频 | 欧美日韩视频网站 | 在线观看免费视频你懂的 | 免费久久久久久 | 亚洲精品在线电影 | 日韩久久一区 | 99中文字幕 | 狠狠色丁香久久婷婷综 | 日本精品久久久久中文字幕5 | 色之综合网 | 二区三区在线观看 | 国产成人久久av | 蜜桃av观看 | 99在线精品观看 | 国产最新视频在线 | 国产在线观看地址 | 九九日韩 | av在线免费在线 | 国产精品嫩草影视久久久 | 国产视频首页 | 偷拍精偷拍精品欧洲亚洲网站 | 亚洲一区不卡视频 | 久久精品系列 | 欧美91精品久久久久国产性生爱 | 亚洲一区二区三区miaa149 | 日免费视频| 色在线网 | 97国产情侣爱久久免费观看 | www..com毛片 | 最新免费av在线 | 中文字幕一区二区三区在线播放 | 日日夜夜操av | 亚洲日本va午夜在线影院 | 久久99精品一区二区三区三区 | 三级av片| 免费在线观看视频a | 91中文字幕在线视频 | 91精品一区国产高清在线gif | 麻豆91视频| 激情偷乱人伦小说视频在线观看 | 日韩久久久久久久久 | 亚洲精品网站 | 日韩精品大片 | 亚洲综合爱 | 美腿丝袜一区二区三区 | 久草在线视频看看 | 国产精品99久久久久久久久久久久 | av在线播放快速免费阴 | 欧美另类xxx| 免费精品在线视频 | 超碰97人人干 | 欧美一级片免费 | 久久综合九色综合久久久精品综合 | 亚洲v欧美v国产v在线观看 | 天天干亚洲 | 97超碰人人看 | 欧美超碰在线 | 国产精品一区在线观看你懂的 | 精品久久1 | 国产免费黄色 | 欧美极品少妇xbxb性爽爽视频 | 国产亚洲精品美女 | 久久精品视频18 | 91高清不卡 | 国产成人一区二区三区影院在线 | 992tv人人网tv亚洲精品 | 日韩av中文在线观看 | 久久久久欧美精品999 | 日韩理论在线观看 | 欧美日韩在线播放 | 欧美一区中文字幕 | 久久免费高清 | 国产麻豆视频网站 | 国产成本人视频在线观看 | 精品一区欧美 | 久久激情久久 | 黄a网| 欧美一二三视频 | 久久电影日韩 | 91丨九色丨国产丨porny精品 | 丁香婷婷在线 | 高清久久久久久 | 日韩欧美一区二区在线观看 | 亚洲成熟女人毛片在线 | 一区二区三区四区五区在线 | 久久福利剧场 | 麻豆果冻剧传媒在线播放 | 免费日韩 精品中文字幕视频在线 | 久久久亚洲精品 | 欧美人人爱 | 欧美一区在线看 | 亚洲午夜久久久久久久久电影网 | 亚洲精品自拍视频在线观看 | 天天躁日日| 国产精品专区一 | 探花视频免费观看高清视频 | 在线免费观看的av | 欧美人人 | 97免费中文视频在线观看 | 日本天天操 | 超碰成人网 | 怡红院成人在线 | 一区二区三区日韩在线 | 国产免费久久精品 | 久久国产高清视频 | 香蕉精品在线观看 | 天天操操操操操操 | 久久精品亚洲精品国产欧美 | 欧美成人影音 | wwwww.国产 | 日韩三级中文字幕 | 久久一区国产 | 日韩精品网址 | 黄网在线免费观看 | 在线国产不卡 | 国产网红在线 | 亚洲国产精品成人精品 | 黄色官网在线观看 | 曰本三级在线 | 天天操天天爱天天爽 | 亚洲精品在线免费看 | 日韩免费视频一区二区 | 超碰电影在线观看 | 免费网站看av片 | 91精品爽啪蜜夜国产在线播放 | www好男人 | 99久久精品免费 | 欧美日韩中文视频 | 欧美巨乳网 | 精品久久久久久一区二区里番 | 国产精品综合久久久久 | 在线亚洲小视频 | 毛片区 | 日韩av免费在线看 | 日韩av视屏在线观看 | 手机在线小视频 | a在线一区 | 狠狠撸电影 | 中文av在线免费观看 | 黄色成人av | 亚洲欧洲av在线 | 国产精品一区二区三区在线播放 | 国产第一页精品 | 亚洲一级电影视频 | 日韩午夜视频在线观看 | 日日操天天射 | 24小时日本在线www免费的 | 香蕉视频在线播放 | 国产香蕉久久 | 91精品国产九九九久久久亚洲 | 中国一区二区视频 | 黄色国产区 | 国产高清视频 | 欧美aa级| 国产又粗又硬又爽的视频 | 久久精品亚洲综合专区 | 色婷婷视频 | 人人插超碰| 国内精品美女在线观看 | 麻豆国产网站 | 亚洲日韩中文字幕在线播放 | 国产四虎影院 | 五月开心六月伊人色婷婷 | 国产剧情在线一区 | 超碰97久久 | 亚洲成人av免费 | 亚洲一级在线观看 | 久久午夜免费视频 | 日韩色综合网 | 成人免费亚洲 | 日韩a免费 | 香蕉视频在线免费 | 久久免费公开视频 | 国产99免费| 久久国内精品99久久6app | 91视频在线看 | 亚洲电影成人 | 97精品国产一二三产区 | 欧美大jb| 国产美女精品视频免费观看 | 四虎www com| 国内久久精品视频 | 国产原创在线 | 伊人热| 日韩精品久久中文字幕 | 九九免费在线观看 | 久久综合狠狠综合久久综合88 | www黄色av | 成人免费xxxxxx视频 | 很黄很色很污的网站 | 91在线免费播放 | 网站你懂的 | 免费观看91视频 | 69精品视频 |