在实际项目中,网络接口可能需要添加多个公共的参数,如果每次请求都手动添加这些参数,简直可怕!
接下来我们就对OkHttp的公共请求参数进行封装
Retrofit
简单的Retrofit 的Get请求如下:
@GET("group")
Call<List<User>> groupList(@Query("sort") String sort);
Post请求:
@FormUrlEncoded
@POST("user/edit")
Call<User> 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<String, Object> 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<String> paramNames = url.queryParameterNames();
//最终的结果为 "p":"{“publicParams”:{...},“key1”:value,“key2”:value}"}
HashMap<String, Object> rootMap = new HashMap<>();
for (String paramName : paramNames) {
if ("p".equals(paramName)) {
String oldParams = url.queryParameter(Constant.API_PARAM);
if (!TextUtils.isEmpty(oldParams)) {
HashMap<String, Object> hashMap = new Gson().fromJson(oldParams, HashMap.class);
//获取传入的参数,并整合到 最终 map 中
if (hashMap != null) {
Set<Map.Entry<String, Object>> entries = hashMap.entrySet();
for (Map.Entry<String, Object> 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<String, Object> 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);
}
}