Retrofit + OkHttp 网络请求公共参数的封装


在实际项目中,网络接口可能需要添加多个公共的参数,如果每次请求都手动添加这些参数,简直可怕!

接下来我们就对OkHttp的公共请求参数进行封装


Retrofit
简单的Retrofit 的Get请求如下:

@GET("group")
Call> groupList(@Query("sort") String sort);

Post请求:

@FormUrlEncoded
@POST("user/edit")
Call updateUser(@Field("first_name") String first, @Field("last_name") String last);

这里每个公司的接口设计不同,公共参数的规则不同,这里只是给出一个例子,具体的逻辑还是需要根据接口设计规则来

例如下面的规则:
客户端上传的参数格式为 json 形式
{
“publicParams”:{...},
“key1”:value,
“key2”:value
}
说明:

Get请求 使用公共的Q uery值为:p

Form 表单格式

publicParams {...}
key1 value1
... ...

封装的类的代码如下:

public class HttpParamInterceptor implements Interceptor {

  

    public HttpParamInterceptor() {
    }

    @Override
    public Response intercept(Chain chain) throws IOException {
        //公共参数
        HashMap commonMap = new HashMap<>();
      
        commonMap.put("paramName", "paramValue");
       
        //获取 缓存的 token
        String token = ACache.get(mContext).getAsString("token");
      //将token传入公共参数
        if (!TextUtils.isEmpty(token)) {
            Log.e("TAG", "token:"+token);
            commonMap.put("token", token);
        }
        //请求对象
        Request request = chain.request();
        String method = request.method();
        if ("GET".equals(method)) {  //GET请求
          
           //获取请求的Url
            HttpUrl url = request.url();
          //请求参数集合
            Set paramNames = url.queryParameterNames();

            //最终的结果为 "p":"{“publicParams”:{...},“key1”:value,“key2”:value}"}
            HashMap rootMap = new HashMap<>();
            for (String paramName : paramNames) {
                if ("p".equals(paramName)) {
                    String oldParams = url.queryParameter(Constant.API_PARAM);
                    if (!TextUtils.isEmpty(oldParams)) {
                      
                        HashMap hashMap = new Gson().fromJson(oldParams, HashMap.class);
                      //获取传入的参数,并整合到 最终 map 中
                        if (hashMap != null) {
                            Set> entries = hashMap.entrySet();
                            for (Map.Entry entry : entries) {
                                rootMap.put(entry.getKey(), entry.getValue());
                            }
                        }
                    }
                } else {
                  //对于多页请求  如果 直接传入 page 参数,没有 @Query 参数 这里会将参数整合
                    rootMap.put(paramName, url.queryParameter(paramName));
                }
            }
            rootMap.put("publicParams", commonMap); //重新组装的参数

            String newParams = new Gson().toJson(rootMap);

            String newUrl = url.toString();
            //由于是get 请求 直接对url 的拼接操作
            int index = newUrl.indexOf("?");
            if (index > 0) {
                newUrl = newUrl.substring(0, index);
            }
          //重新整合 params
            newUrl = newUrl + "?" + Constant.API_PARAM + "=" + newParams;
            request = request.newBuilder().url(newUrl).build();
          
        } else if ("POST".equals(method)) {  //POST 请求
            RequestBody body = request.body();
            HashMap rootMap = new HashMap<>();
         
            if (body instanceof FormBody) {//表单数据
              
                FormBody formBody = (FormBody) body;
                FormBody.Builder builder = new FormBody.Builder();
                int size = formBody.size();
              //  传入的FormBody 内容
                for (int i = 0; i < size; i++) {
                    builder.add(formBody.name(i), formBody.value(i));
                }
              //拼接common参数
                String commonParam = new Gson().toJson(commonMap);
                builder.add(Constant.PUBLICPARAMS, commonParam);

                formBody = builder.build();

                request = request.newBuilder()
                        .post(formBody)
                        .build();

            } else {   // post 的Json 数据
              
                Buffer buffer = new Buffer();
                body.writeTo(buffer);
                String oldParams = buffer.readUtf8(); //读取 传入的 json 字符串
                if (oldParams != null) {
                  //拼接参数
                    rootMap = new Gson().fromJson(oldParams, HashMap.class);
                    rootMap.put(Constant.PUBLICPARAMS, commonMap);
                    String newJsonParams = new Gson().toJson(rootMap);
                    
                  //request 的重新构建
                    MediaType JSON
                            = MediaType.parse("application/json; charset=utf-8");
                    request = request.newBuilder()
                            .post(RequestBody.create(JSON, newJsonParams))
                            .build();
                }

            }


        }

        return chain.proceed(request);
    }

}

你可能感兴趣的:(Retrofit + OkHttp 网络请求公共参数的封装)