OkHttp
项目地址
https://github.com/square/okhttp
特点
- 支持HTTP/2, HTTP/2通过使用多路复用技术在一个单独的TCP连接上支持并发, 通过在一个连接上一次性发送多个请求来发送或接收数据
- 如果HTTP/2不可用, 连接池复用技术也可以极大减少延时
- 支持GZIP, 可以压缩下载体积
- 响应缓存可以直接避免重复请求
- 会从很多常用的连接问题中自动恢复
- 如果您的服务器配置了多个IP地址, 当第一个IP连接失败的时候, OkHttp会自动尝试下一个IP
- OkHttp还处理了代理服务器问题和SSL握手失败问题
简单的例子
异步发送请求
public void asynchronousGetTest(){
Request request = new Request.Builder()
.url("http://www.baidu.com")
.build();
Call call = mClient.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws IOException {
Logger.i(response.body().string());
}
});
}
同步发送请求
public void synchronousGetTest(){
Request request = new Request.Builder()
.url("http://www.baidu.com")
.build();
Call call = mClient.newCall(request);
try {
Response response = call.execute();
if (response.isSuccessful()){
}
} catch (IOException e) {
e.printStackTrace();
}
}
OkHttpClient.Builder设置
/**
* 设置读写超时和连接超时
*/
builder.connectTimeout(10_000, TimeUnit.MILLISECONDS);
builder.readTimeout(10_000, TimeUnit.MILLISECONDS);
builder.writeTimeout(10_000, TimeUnit.MILLISECONDS);
/**
* 默认是重定向
*/
builder.followRedirects(true);
Request.Builder设置
Request.Builder builder = new Request.Builder();
/**
* 请求地址
* builder.url(String url);
* builder.url(URL url);
* builder.url(HttpUrl url);
*/
builder.url("http://www.baidu.com");
/**
* 头文件操作
*/
builder.header("User-Agent", "OkHttp Headers.java");
builder.addHeader("Accept", "application/json; q=0.5");
/**
* 对缓存的处理
*/
builder.cacheControl(CacheControl.FORCE_NETWORK);
/**
*
* 请求方式
*
* builder.get()
* builder.head();
* builder.post();
* builder.put();
* builder.patch();
* builder.delete();
*
*/
builder.get();
拦截器
拦截器是一种强大的机制,可以监视、重写和重试调用。
应用拦截器
- 不需要担心中间过程的响应,如重定向和重试.
- 总是只调用一次,即使HTTP响应是从缓存中获取.
- 观察应用程序的初衷. 不关心OkHttp注入的头信息如: If-None-Match.
- 允许短路而不调用 Chain.proceed(),即中止调用.
- 允许重试,使 Chain.proceed()调用多次.
网络拦截器
- 能够操作中间过程的响应,如重定向和重试.
- 当网络短路而返回缓存响应时不被调用.
- 只观察在网络上传输的数据.
- 携带请求来访问连接.
添加拦截器
/**
* 应用拦截器
*/
builder.addInterceptor(new MyInterceptor());
/**
* 网络拦截器
*/
builder.addNetworkInterceptor(new MyNetworkInterceptor());
MyInterceptor.class
/**
* 应用拦截器
*/
/**
* 应用拦截器
*/
public class MyInterceptor implements Interceptor {
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
Logger.i(String.format("MyInterceptor Send request Url: %s",
request.url()));
Response response = chain.proceed(request);
Logger.i(String.format("MyInterceptor Received response length: %s ", response.body().contentLength()));
return response;
}
}
MyNetworkInterceptor.class
/**
* 网络拦截器
*/
public class MyNetworkInterceptor implements Interceptor {
@Override
public Response intercept(Interceptor.Chain chain) throws IOException {
Request request = chain.request();
Logger.i(String.format("MyNetworkInterceptor Send request for %s %n%s",
request.url(), request.headers()));
long t1 = System.nanoTime();
Response response = chain.proceed(request);
long t2 = System.nanoTime();
Logger.i(String.format("MyNetworkInterceptor Received response for %s in %.1fms%n%s",
response.request().url(), (t2 - t1) / 1e6d, response.headers()));
return response;
}
}
相关的文章
OkHttp3中的代理与路由
http://www.jianshu.com/p/5c98999bc34f
通过OkHttp代码分析解释,代理设置究竟是如何工作的呢?它是如何影响我们上面看到的HTTP请求的处理过程的呢?是在操作系统内核的TCP实现中的策略呢,还是HTTP stack中的机制?
OkHttp3源码分析
http://www.jianshu.com/p/6637369d02e7
OkHttp3源码分析[综述] OkHttp3源码分析[复用连接池] OkHttp3源码分析[缓存策略] OkHttp3源码分析[DiskLruCache] OkHttp3源码分析[任务队列]