一口吃不成一个大胖子,一步一步地讲解各个框架特性及使用,再连接起来。
文章目录
OkHttp
implementation 'com.squareup.okhttp3:okhttp:3.11.0'
Header的设置
- 使用header(name,value)来设置HTTP头的唯一值,如果请求中已经存在响应的信息那么直接替换掉。
- 使用addHeader(name,value)来补充新值,如果请求头中已经存在name的name-value,那么还会继续添加,请求头中便会存在多个name相同而value不同的“键值对”。
- 使用header(name)读取唯一值或多个值的最后一个值
- 使用headers(name)获取所有值
GET & POST请求
private String post() throws IOException {
MediaType mediaType = MediaType.parse("text/x-markdown; charset=utf-8");
String requestBody = "I am Renly.";
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url(NetConfig.REQUEST_URL)
.header("Token","TokenValue")
.addHeader("HeaderName","HeaderValue")
.post(RequestBody.create(mediaType, requestBody)) // 默认是GET请求,GET请求可以不写
.build();
// 同步请求
Response response = client.newCall(request).execute();
// 异步请求,此方法不适合该方法
// Response response = client.newCall(request).enqueue(new Callback() {
// @Override
// public void onFailure(Call call, IOException e) {
// Log.e(TAG,"getResponse fail " + e.getMessage());
// }
//
// @Override
// public void onResponse(Call call, Response response) throws IOException {
// Log.e(TAG,"getResponse success " + response.body().string());
// }
// });
return response.body().string();
}
拦截器-interceptor
OkHttp的拦截器链可谓是其整个框架的精髓,用户可传入的 interceptor 分为两类:
- 一类是全局的 interceptor,该类 interceptor 在整个拦截器链中最早被调用,通过 OkHttpClient.Builder#addInterceptor(Interceptor) 传入;
- 另外一类是非网页请求的 interceptor ,这类拦截器只会在非网页请求中被调用,并且是在组装完请求之后,真正发起网络请求前被调用,所有的 interceptor 被保存在 List<Interceptor> interceptors 集合中,按照添加顺序来逐个调用,具体可参考 RealCall#getResponseWithInterceptorChain() 方法。通过 OkHttpClient.Builder#addNetworkInterceptor(Interceptor) 传入;
这里举一个简单的例子,例如有这样一个需求,我要监控App通过 OkHttp 发出的所有原始请求,以及整个请求所耗费的时间,针对这样的需求就可以使用第一类全局的 intercept