这次总结我对于Okhttp中GET、POST、拦截器的使用
1、先导入依赖
//okhttp
implementation("com.squareup.okhttp3:okhttp:4.9.1")
implementation("com.squareup.okhttp3:logging-interceptor:4.9.1")
2、工具类的封装
/**
* OkHttp工具类,提供拦截器传入Headers信息,
* 提供了
* doGet(url,headers,callBack)、
* doPost(url,headers,params,callBack)、
* doPostMultiPart(url,headers,params,callBack)、
* doPostJson(url, headers, jsonStr, callBack)方法
*/
public class OkHttpUtils {
private final Handler mUiHandler = new Handler(Looper.getMainLooper());
private final OkHttpClient mOkHttpClient;
private OkHttpUtils() {
HttpLoggingInterceptor logging = new HttpLoggingInterceptor(new HttpLoggingInterceptor.Logger() {
@Override//从此打印拦截器中的信息
public void log(@NotNull String message) {
Log.d("hyman", message);
}
});
logging.setLevel(HttpLoggingInterceptor.Level.BODY);
mOkHttpClient = new OkHttpClient.Builder()
// .connectTimeout()
.addInterceptor(new AuthInterceptor())
.addInterceptor(logging)
.build();
}
private static final OkHttpUtils sInstance = new OkHttpUtils();
public static OkHttpUtils getInstance() {
return sInstance;
}
//GET
public void doGet(String url, HashMap<String, String> headers, INetCallBack callBack) {
Request.Builder builder = new Request.Builder();
if (headers != null) {
for (String key : headers.keySet()) {
builder.addHeader(key, Objects.requireNonNull(headers.get(key)));
}
}
Request request = builder
.url(url)
.build();
executeRequest(callBack, request);
}
//post
public void doPost(String url, HashMap<String, String> headers, HashMap<String, String> params, INetCallBack callBack) {
FormBody.Builder formBodyBuilder = new FormBody.Builder();
if (params != null) {
for (String param : params.keySet()) {
formBodyBuilder.add(param, Objects.requireNonNull(params.get(param)));
}
}
Request.Builder requestBuilder = new Request.Builder();
if (headers != null) {
for (String key : headers.keySet()) {
requestBuilder.addHeader(key, Objects.requireNonNull(headers.get(key)));
}
}
Request request = requestBuilder
.url(url)
.post(formBodyBuilder.build())
.build();
executeRequest(callBack, request);
}
//支持文件上传的post请求
public void doPostMultiPart(String url, HashMap<String, String> headers, HashMap<String, String> params, INetCallBack callBack) {
MultipartBody.Builder multipartBodyBuilder = new MultipartBody.Builder();
multipartBodyBuilder.setType(MultipartBody.FORM);
if (params != null) {
for (String param : params.keySet()) {
multipartBodyBuilder.addFormDataPart(param, Objects.requireNonNull(params.get(param)));
}
}
Request.Builder requestBuilder = new Request.Builder();
if (headers != null) {
for (String key : headers.keySet()) {
requestBuilder.addHeader(key, Objects.requireNonNull(headers.get(key)));
}
}
Request request = requestBuilder
.url(url)
.post(multipartBodyBuilder.build())
.build();
executeRequest(callBack, request);
}
public void doPostJson(String url, HashMap<String, String> headers, String jsonStr, INetCallBack callBack) {
MediaType jsonMediaType = MediaType.get("application/json");
RequestBody requestBody = RequestBody.create(jsonStr, jsonMediaType);
Request.Builder requestBuilder = new Request.Builder();
if (headers != null) {
for (String key : headers.keySet()) {
requestBuilder.addHeader(key, Objects.requireNonNull(headers.get(key)));
}
Request request = requestBuilder
.url(url)
.post(requestBody)
.build();
executeRequest(callBack, request);
}
}
private void executeRequest(INetCallBack callBack, Request request) {
Call call = mOkHttpClient.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(@NotNull Call call, @NotNull IOException e) {
mUiHandler.post(new Runnable() {
@Override
public void run() {
callBack.onFailed(e);
}
});
}
@Override
public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
String respStr = null;
try {
respStr = Objects.requireNonNull(response.body()).string();
} catch (IOException e) {
mUiHandler.post(new Runnable() {
@Override
public void run() {
callBack.onFailed(e);
}
});
return;
}
String finalRespStr = respStr;
mUiHandler.post(new Runnable() {
@Override
public void run() {
callBack.onSuccess(finalRespStr);
}
});
}
});
}
}
3、自定义接口类
public interface INetCallBack {
void onSuccess(String response);
void onFailed(Throwable ex);
}
4、拦截器(实际上就是做了一个添加Heanders的功能)
/**
* 拦截器
*/
public class AuthInterceptor implements Interceptor {
@NotNull
@Override
public Response intercept(@NotNull Chain chain) throws IOException {
String token = (String) Utils.sp_get("token", "");
Log.d("intercept", token);
Request orginRequest = chain.request();
Request newRequest = orginRequest.newBuilder()
.addHeader("headers的key", "headers的value")//头部信息。此处传入的话,使用时就不需要传了
.build();
return chain.proceed(newRequest);
}
}
5、使用示例
HashMap<String, String> map = new HashMap<>();
map.put("key", "value");//参数
HashMap<String, String > headers = new HashMap<>();
headers.put("headers的key", "headers的value");//头部信息。此处传入的话,拦截器类中就不需要传了
OkHttpUtils.getInstance().doPost("请求时的地址", headers, map, new INetCallBack() {
@Override
public void onSuccess(String response) {
Log.d("onSuccess","onSuccess");
//成功的回调
}
@Override
public void onFailed(Throwable ex) {
//失败的回调
}
});
此次总结,是因为我在项目中需要向服务端传头部信息。你们可以自行再次封装使用或者参考学习。不喜勿喷哈!