OkHttp网络请求,GET、POST、拦截器

这次总结我对于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) {
                                //失败的回调
                            }
                        });

此次总结,是因为我在项目中需要向服务端传头部信息。你们可以自行再次封装使用或者参考学习。不喜勿喷哈!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值