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源码分析[任务队列]

results matching ""

    No results matching ""