如果我们需要动态配置请求头呢,请求 TAG 呢,这时候你会怎么写,继续增加参数吗?
这时候接口可能如下:
public interface NetRequest{
void doGet(Context context,String url, final Map<String, String> paramsMap,final Map<String, String> headMap, String tag,final IResponseListener iResponseListener);
}
那以后如果要配置缓存路径呢,配置请求超时时间,读取超时时间呢,直接在方法中增加相应的参数?
这样的做法是不太明智的,会导致接口越来越臃肿。
既然这样,那有没有办法解决呢?
首先,我们先回想一下,网络请求那些参数是必要的,那些是非必要的,即可有可无的。
必要选项
-
url,请求网址
-
paramsMap ,请求参数
-
iResponseListener 请求结果的回调
非必要选项
-
context 通常是用来配置配置一些缓存等一些信息
-
headMap 请求头
-
tag 请求 TAG,用来区分或者取消网络请求
-
connectTimeout 连接超时时间
-
readTimeout 读取超时时间
-
writeTimeout 写入超时时间
了解完必要参数和非必要参数之后,我们的接口要怎样提取呢?
不知道大家有没有注意到 okHttpClient 的构建,他将所有的网络配置都提取封装在 OkHttpClient,Request 中,在请求网络的时候减少了相应的参数,简洁灵活。
OkHttpClient.Builder mBuilder= new OkHttpClient.Builder().
connectTimeout(10, TimeUnit.SECONDS).writeTimeout(10, TimeUnit.SECONDS)
.readTimeout(30, TimeUnit.SECONDS)
.addInterceptor(new LoggingInterceptor())
.cache(new Cache(context.getExternalFilesDir(“okhttp”),cacheSize));
OkHttpClient cilent = mBuilder.build();
Request.Builder builder = new Request.Builder().url(url);
client.newCall(builder.build()).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
handleError(e, iResponseListener);
}
@Override
public void onResponse(Call call, Response response) throws IOException {
handleResult(response, iResponseListener);
}
});
看了 OKhttp 的代码,我们也可以依样画葫芦,我们可以将非必要参数封装在一个实体类 NetworkOption 当中,必要的参数作为方法参数,这样接口变成以下的形式。
void doGet(String url, final Map<String, String> paramsMap, final IResponseListener iResponseListener);
void doGet(String url, final Map<String, String> paramsMap, NetworkOption networkOption, final IResponseListener iResponseListener);
对比直接在方法中增加相应的参数,是不是简洁很多。
接着,我们一起来看一下 NetworkOption 的属性。基本上,只要 okhttp 可以配置的,我们都可以往里面配置。这里列举了一些常用的字段 ,baseUrl,请求标志 tag,请求头 mHeaders。-connectTimeout 连接超时时间,readTimeout 读取超时时间,writeTimeout 写入超时时间就不一一列举了。
public class NetworkOption {
/**
- 网络请求的 TAG
*/
public String mBaseUrl;
public String mTag;
public Map<String,String> mHeaders;
public NetworkOption(String tag) {
this.mTag = tag;
}
public static final class Builder{
public String tag;
public Map<String,String> mHeaders;
public String mBaseUrl;
public Builder setTag(String tag){
this.tag=tag;
return this;
}
public Builder setHeaders(