OKHttp相关笔记

简介

OkHttp是Square开源的轻量级框架,是一款现代、高效、快速的Android版Http client.

OkHttp 特点:

  • 支持 HTTP2/SPDY 黑科技
  • socket 自动选择最优路线,并支持自动重连。
  • 拥有自动维护的 socket 连接池,减少握手次数
  • 拥有队列线程池,轻松写并发
  • 拥有 Interceptors 轻松处理请求与响应(比如透明 GZIP 压缩、 LOGGING)
  • 基于 Headers 的缓存策略。

使用

最简单使用

OkHttpClient client = new OkHttpClient();//创建OkHttpClient对象
Request request = new Request.Builder()
     .url(url)//请求链接
     .build();//创建Request对象
Response response = client.newCall(request).execute();//获取Response对象

拦截器

对网络请求过程处理,例如打印log,常用拦截器。

拦截器的使用,以替换请求的url为例。

// 替换请求的url
public class DynamicUrlInterceptor implements Interceptor {
    /**
     * 原始的url
     */
    private String mOriginalUrl;
    /**
     * 需要替换的url
     */
    private String mReplaceUrl;

    public DynamicUrlInterceptor(String originalUrl) {
        mOriginalUrl = originalUrl;
    }

    @Override
    public Response intercept(Chain chain) throws IOException {
        if (TextUtils.isEmpty(mReplaceUrl)) {
            return chain.proceed(chain.request());
        }

        Request oldRequest = chain.request();
        String oldUrl = oldRequest.url().toString();
        String newUrl = mReplaceUrl + oldUrl.substring(mOriginalUrl.length());
        Request newRequest = oldRequest.newBuilder().url(newUrl).build();

        Log.i("DynamicUrlInterceptor", "interceptor url=" + newRequest.url());

        return chain.proceed(newRequest);
    }

    /**
     * 更新请求 url
     *
     * @param url 新url
     */
    public void updateBaseUrl(String url) {
        if (TextUtils.isEmpty(url) || TextUtils.equals(url, mOriginalUrl)) {
            return;
        }
        if (url.startsWith("http") && url.endsWith("/")) {
            mReplaceUrl = url;
        }
    }
}

关于OkHttp的原理,和拦截器可以参考这边文章 OKHttp的工作原理

Retrofit

一个封装好的网络请求库。

  • 基于OkHttp,遵循Restful API设计风格。
  • 通过注解配置网络请求参数。
  • 支持同步和异步网络请求。
  • 支持多种数据的解析和序列化格式(Json、XML、Protobuf)
  • 支持对RxJava.

支持的注解

Retrofit注解分为三大类,分别是HTTP请求方法注解(8种)、标记类注解(3种)和参数类注解(11种)。

• HTTP请求方法注解:GETPOSTPUTDELETEPATCHHEADOPTIONSHTTP
• 标记类注解:FormUrlEncodedMultipartStreaming
• 参数类注解:HeadersHeaderBodyFieldFieldMapPartPartMapPathQueryQueryMapUrl
关于注解的使用,参考:Android Retrofit 使用详解.

retrofit 网络请求示例

接口定义

public interface RetrofitService {

    /**
     * 获取快递信息
     *
     * @param type   快递类型
     * @param postid 快递单号
     * @return Call<PostInfo>
     */
    @GET("query")
    Call<PostInfo> getPostInfo(@Query("type") String type, @Query("postid") String postid);
}

网络请求

Retrofit retrofit = new Retrofit.Builder()
        .baseUrl("http://www.kuaidi100.com/")
        .addConverterFactory(GsonConverterFactory.create())
        .build();
        
RetrofitService service = retrofit.create(RetrofitService.class);

Call<PostInfo> call = service.getPostInfo("yuantong", "11111111111");

//这里使用retrofit异步请求
call.enqueue(new Callback<PostInfo>() {
    @Override
    public void onResponse(Call<PostInfo> call, Response<PostInfo> response) {
        Log.i("http返回:", response.body().toString() + "");
    }

    @Override
    public void onFailure(Call<PostInfo> call, Throwable t) {

    }
});
//retrofit同步请求
//Response<PostInfo> response = call.execute()

retrofit 结合rxJava使用

配置retrofit 支持 rxJava. retrofit.addCallAdapterFactory

Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("http://fy.iciba.com/") // 设置 网络请求 Url
                .addConverterFactory(GsonConverterFactory.create()) //设置使用Gson解析(记得加入依赖)
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) // 支持RxJava
                .build();

定义接口

public interface GetRequest_Interface {

    @GET("ajax.php?a=fy&f=auto&t=auto&w=hi%20world")
    Observable<Translation> getCall();
}

调用接口

    // 创建 网络请求接口 的实例
    GetRequest_Interface request = retrofit.create(GetRequest_Interface.class);

    // 采用Observable<...>形式 对 网络请求 进行封装
    Observable<Translation> observable = request.getCall();

    //发送网络请求
    observable.subscribeOn(Schedulers.io())               // 在IO线程进行网络请求
              .observeOn(AndroidSchedulers.mainThread())  // 回到主线程 处理请求结果
              .subscribe(new Observer<Translation>() {
                @Override
                public void onSubscribe(Disposable d) {
                    Log.d(TAG, "开始采用subscribe连接");
                }

                @Override
                public void onNext(Translation result) {
                    // 步骤8:对返回的数据进行处理
                    result.show() ;
                }
                
               @Override
               public void onError(Throwable e) {
                    Log.d(TAG, "请求失败");
               }

               @Override
               public void onComplete() {
                    Log.d(TAG, "请求成功");
               }
           });

参考资料

OKHttp的工作原理
Android Retrofit 使用详解


版权声明:本文为ti_an_1989原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。