直接上代码
首先导入okhttop和Gson库
- implementation 'com.squareup.okhttp3:okhttp:3.9.0'
- implementation 'com.google.code.gson:gson:2.10.1'
添加权限
-
- <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
-
- <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
-
- <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
-
- <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
-
- <uses-permission android:name="android.permission.INTERNET"/>
下面是网络请求工具类封装
-
-
- import android.app.ProgressDialog;
- import android.content.Context;
- import android.os.Handler;
- import android.os.Looper;
-
- import androidx.annotation.NonNull;
-
- import java.io.IOException;
- import java.util.Map;
- import java.util.Objects;
- import java.util.concurrent.TimeUnit;
-
- import okhttp3.Call;
- import okhttp3.Callback;
- import okhttp3.FormBody;
- import okhttp3.OkHttpClient;
- import okhttp3.Request;
- import okhttp3.Response;
-
- public class OkhtttpUtils {
-
- private final Handler mHandler; // 主线程Handler
- private final OkHttpClient mOkHttpClient; // OkHttpClient实例
- private static OkhtttpUtils sOkhtttpUtils;
- private String mToken;
-
- private OkhtttpUtils() {
- mHandler = new Handler(Looper.getMainLooper());
-
- // 创建OkHttpClient实例
- mOkHttpClient = new OkHttpClient.Builder()
- .readTimeout(5000, TimeUnit.MILLISECONDS) // 设置读取超时时间
- .connectTimeout(5000, TimeUnit.MILLISECONDS) // 设置连接超时时间
- .writeTimeout(5000, TimeUnit.MILLISECONDS) // 设置写入超时时间
- .retryOnConnectionFailure(true) // 设置失败重试
- .build();
- }
-
- // 获取单例实例
- public static OkhtttpUtils getInstance() {
- if (sOkhtttpUtils == null) {
- synchronized (OkhtttpUtils.class) {
- if (sOkhtttpUtils == null) {
- sOkhtttpUtils = new OkhtttpUtils();
- }
- }
- }
- return sOkhtttpUtils;
- }
-
- // 设置token
- public void setToken(String token) {
- mToken = token;
- }
- // 清除token
- public void clearToken() {
- mToken = null;
- }
-
- // 更新token
- public void updateToken(String newToken) {
- mToken = newToken;
- }
- // 自定义回调接口
- public interface OkCallback {
- void onFailure(Exception e); // 请求失败回调
-
- void onResponse(String json); // 请求成功回调
- }
-
- // 发起Get请求
- public void doGet(Context context,String url, Map
params, final OkCallback ycfOkCallback) { - // 显示数据加载中
- showLoadingDialog(context);
-
- if (params != null && !params.isEmpty()) {
- StringBuilder urlBuilder = new StringBuilder(url);
- if (!url.contains("?")) {
- urlBuilder.append("?");
- } else {
- urlBuilder.append("&");
- }
- for (Map.Entry
entry : params.entrySet()) { - urlBuilder.append(entry.getKey()).append("=").append(entry.getValue()).append("&");
- }
- url = urlBuilder.toString();
- }
-
- Request.Builder requestBuilder = new Request.Builder()
- .get()
- .url(url);
-
- // 判断是否设置了token,如果设置了,则添加到请求头中
- if (mToken != null) {
- requestBuilder.addHeader("Authorization", mToken);
- }
-
- Request request = requestBuilder.build();
-
- Call call = mOkHttpClient.newCall(request);
- call.enqueue(new Callback() {
- @Override
- public void onFailure(@NonNull Call call, final IOException e) {
- // 加载失败
- dismissLoadingDialog(context);
- if (ycfOkCallback != null) {
- mHandler.post(() -> ycfOkCallback.onFailure(e));
- }
- }
-
- @Override
- public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
- dismissLoadingDialog(context);
- if (response.isSuccessful()) {
- final String json = Objects.requireNonNull(response.body()).string();
- if (ycfOkCallback != null) {
- mHandler.post(() -> ycfOkCallback.onResponse(json));
- }
- } else {
- // 加载失败
- if (ycfOkCallback != null) {
- mHandler.post(() -> ycfOkCallback.onFailure(new IOException("Response unsuccessful")));
- }
- }
- }
- });
- }
-
- private ProgressDialog progressDialog;
-
- private void showLoadingDialog(Context context) {
- progressDialog = new ProgressDialog(context);
- progressDialog.setMessage("数据加载中...");
- progressDialog.setCancelable(false);
- progressDialog.show();
- }
-
- /**
- * 隐藏加载对话框(带参数Context)
- * @param context 上下文环境
- */
- private void dismissLoadingDialog(Context context) {
- if (progressDialog != null && progressDialog.isShowing()) {
- progressDialog.dismiss();
- }
- }
-
- /**
- * 隐藏加载对话框(无参数)
- */
- private void dismissLoadingDialog() {
- if (progressDialog != null && progressDialog.isShowing()) {
- progressDialog.dismiss();
- }
- }
-
- // 发起Post请求
- public void doPost( Context context,String url, Map
params, final OkCallback ycfOkCallback) { - // 显示数据加载中
- showLoadingDialog(context);
-
- FormBody.Builder builder = new FormBody.Builder();
- if (params != null && !params.isEmpty()) {
- for (Map.Entry
entry : params.entrySet()) { - builder.add(entry.getKey(), Objects.requireNonNull(entry.getValue()));
- }
- }
- FormBody formBody = builder.build();
-
- Request.Builder requestBuilder = new Request.Builder()
- .post(formBody)
- .url(url);
-
- // 判断是否设置了token,如果设置了,则添加到请求头中
- if (mToken != null) {
- requestBuilder.addHeader("Authorization", mToken);
- }
-
- Request request = requestBuilder.build();
-
- Call call = mOkHttpClient.newCall(request);
- call.enqueue(new Callback() {
- @Override
- public void onFailure(@NonNull Call call, final IOException e) {
- dismissLoadingDialog(context);
- if (ycfOkCallback != null) {
- mHandler.post(() -> ycfOkCallback.onFailure(e));
- }
- }
-
- @Override
- public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
- dismissLoadingDialog(context);
- if (response.isSuccessful()) {
- final String json = Objects.requireNonNull(response.body()).string();
- if (ycfOkCallback != null) {
- mHandler.post(() -> ycfOkCallback.onResponse(json));
- }
- } else {
- if (ycfOkCallback != null) {
- mHandler.post(() -> ycfOkCallback.onFailure(new IOException("Response unsuccessful")));
- }
- }
- }
- });
- }
- }
调用方式
-
- import androidx.appcompat.app.AppCompatActivity;
-
- import android.os.Bundle;
- import android.util.Log;
- import android.widget.TextView;
-
- import com.google.gson.Gson;
-
- import java.util.HashMap;
- import java.util.Map;
-
- import okhttp3.FormBody;
- import okhttp3.MediaType;
- import okhttp3.RequestBody;
-
- public class MainActivity extends AppCompatActivity {
-
- private TextView text;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- text=findViewById(R.id.text);
-
- //get请求
-
- // Map
params = new HashMap<>(); - // OkhtttpUtils.getInstance().doGet(this, "https://ku.qingnian8.com/dataApi/news/navlist.php", params, new OkhtttpUtils.OkCallback() {
- // @Override
- // public void onFailure(Exception e) {
- // Log.d("get请求失败数据", e.getMessage());
- // text.setText( "get请求失败数据"+e.getMessage());
- // }
- //
- // @Override
- // public void onResponse(String json) {
- // Log.d("get请求成功数据", json);
- // text.setText( json);
- // }
- // });
-
-
- OkhtttpUtils.getInstance().setToken("3A6943C3B865FA2B2C825CDCB33C5304");//设置token
- OkhtttpUtils.getInstance().clearToken();//清空
- OkhtttpUtils.getInstance().updateToken("3A6943C3B865FA2B2C825CDCB33C5304");//更新oken
-
- //post请求
-
- Map
postParams = new HashMap<>(); - postParams.put("order_number", "3A6943C3B865FA2B2C825CDCB33C5304");
- OkhtttpUtils.getInstance().doPost(this, "https://api-hmugo-web.itheima.net/api/public/v1/my/orders/req_unifiedorder", postParams, new OkhtttpUtils.OkCallback() {
- @Override
- public void onFailure(Exception e) {
- Log.d("post请求失败数据", e.getMessage());
- text.setText( "post请求失败数据"+e.getMessage());
- }
-
- @Override
- public void onResponse(String json) {
- Log.d("post请求成功数据", json);
- text.setText( json);
- }
- });
-
- }
- }
布局代码
- "1.0" encoding="utf-8"?>
- <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:app="http://schemas.android.com/apk/res-auto"
- xmlns:tools="http://schemas.android.com/tools"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- tools:context=".MainActivity">
-
- <TextView
- android:id="@+id/text"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="Hello World!"
- app:layout_constraintBottom_toBottomOf="parent"
- app:layout_constraintEnd_toEndOf="parent"
- app:layout_constraintStart_toStartOf="parent"
- app:layout_constraintTop_toTopOf="parent" />
-
- androidx.constraintlayout.widget.ConstraintLayout>
注意这点不要忘记添加 网络安全配置 ,这段配置的作用是允许应用中的明文流量,并指定了信任锚点的证书来
然后,在应用的清单文件(
AndroidManifest.xml)中的标签内添加以下代码,引用刚刚创建的网络安全配置文件:
- <application
- ...
- android:networkSecurityConfig="@xml/network_security_config"
- ...>
- ...
- application>
network_security_config.xml
- <network-security-config>
- <base-config cleartextTrafficPermitted="true">
- <trust-anchors>
- <certificates src="system" />
- <certificates src="user" />
- trust-anchors>
- base-config>
- network-security-config>
至此就是安卓okhttp网络请求封装及使用