简介
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请求方法注解:GET、POST、PUT、DELETE、PATCH、HEAD、OPTIONS、HTTP
• 标记类注解:FormUrlEncoded、Multipart、Streaming
• 参数类注解:Headers、Header、Body、Field、FieldMap、Part、PartMap、Path、Query、QueryMap、Url
关于注解的使用,参考: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, "请求成功");
}
});
参考资料
版权声明:本文为ti_an_1989原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。