直接上代码
首先导入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"/>
<!--允许应用程序改变WIFI连接状态-->
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
<!--允许应用程序访问有关的网络信息-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<!--允许应用程序访问WIFI网卡的网络信息-->
<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<String, String> 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<String, String> 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<String, String> params, final OkCallback ycfOkCallback) {
// 显示数据加载中
showLoadingDialog(context);
FormBody.Builder builder = new FormBody.Builder();
if (params != null && !params.isEmpty()) {
for (Map.Entry<String, String> 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<String, String> 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<String, String> 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);
}
});
}
}
布局代码
<?xml version="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>
标签内添加以下代码,引用刚刚创建的网络安全配置文件:
<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网络请求封装及使用