1. 程式人生 > 其它 >安卓基礎學習 Day23 |HTTP框架-OKHttp3

安卓基礎學習 Day23 |HTTP框架-OKHttp3

技術標籤:學習日誌

目錄

寫在前面的話

1、主要參考自:https://b23.tv/FABE0n
2、內容如果有不對的,希望可以指出或補充。
3、新知識。

一、概述

OKHttp:是一個高效的HTTP客戶端。支援get請求和post請求,支援基於Http/https的(大)檔案上傳和下載,支援載入圖片,支援連線同一個地址的連結共享同一個socket(計算機之間進行通訊的一種約定或一種方式),通過連線池來減小響應延遲,還有下載檔案透明的GZIP壓縮(網站壓縮加速的一種技術),請求快取等優勢。用於替代HttpUrlConnection和AsyncHttpClient

其核心主要有:路由、連線協議、攔截器(主要是指新增、移除或轉換請求或迴應的頭部資訊)、代理、安全性認證、連線池以及網路適配。

這個框架也是square公司開源的一個網路請求庫(okhttp內部依賴okio)。已被Google使用在Android原始碼上。

OKHttp使用時必須在子執行緒中執行

二、GET和POST請求

(一)步驟展示

1 依賴

對應的build.gradle檔案

專案清單檔案

2 佈局

3 程式碼

MainActivity.java

package com.example.testokhttp;

import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.view.View; import android.widget.Button; import android.widget.TextView; import java.io.IOException; import okhttp3.MediaType; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.RequestBody;
import okhttp3.Response; public class MainActivity extends AppCompatActivity implements View.OnClickListener { private static final int GET = 1; private static final int POST = 2; private Button btnGet,btnPost; private TextView tvResult; private OkHttpClient client = new OkHttpClient(); //解決不能在子執行緒中顯示在文字上 private Handler handler = new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what){ case GET: tvResult.setText((String) msg.obj);//獲取資料 break; case POST: tvResult.setText((String) msg.obj);//獲取資料 break; } } }; //編碼配置 public static final MediaType JSON = MediaType.parse("application/json; charset=utf-8"); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //獲取控制元件 btnGet = findViewById(R.id.btn_get); btnPost = findViewById(R.id.btn_post); tvResult = findViewById(R.id.tv_result); //設定點選事件 btnGet.setOnClickListener(this); btnPost.setOnClickListener(this); } @Override //點選事件 public void onClick(View v) { switch (v.getId()){ //使用原生的okhttp請求網路資料-get、post case R.id.btn_get: getDataFromGet(); break; case R.id.btn_post: getDataFromPost(); break; } } //開啟子執行緒,調get方法 private void getDataFromGet() { //new一個子執行緒 new Thread(){ @Override public void run() { super.run(); try { String result = get("http://wwww.baidu.com"); Message msg = Message.obtain(); msg.what = GET; msg.obj = result;//攜帶返回的資料 handler.sendMessage(msg);//發到這 } catch (IOException e) { e.printStackTrace(); } } }.start(); } //開啟子執行緒,調post方法 private void getDataFromPost() { //new一個子執行緒 new Thread(){ @Override public void run() { super.run(); try { String result = post("https://api.github.com/markdown/raw",""); Message msg = Message.obtain(); msg.what = POST; msg.obj = result;//攜帶返回的資料 handler.sendMessage(msg);//發到這 } catch (IOException e) { e.printStackTrace(); } } }.start(); } //非同步GET請求-預設get請求 private String get(String url) throws IOException{ Request request = new Request.Builder() .url(url) .build(); Response response = client.newCall(request).execute(); return response.body().string(); } //post請求 //引數-json:上傳資料時需要 private String post(String url, String json) throws IOException{ RequestBody body = RequestBody.create(JSON, json); Request request = new Request.Builder() .url(url) .post(body)// .build(); Response response = client.newCall(request).execute(); return response.body().string(); } }

(二)效果展示

執行結果如下。

明天繼續。

補充

1、Okhttp3基本使用

2、Socket技術詳解

3、下載地址