说到目前最火的网络请求库,那肯定是的非Retrofit莫属了,如果你还不了解Retrofit如何使用,如果你想让自己的网络请求库更优雅一些,那么你来对地方了。
Retrofit与okhttp共同出自于Square公司,retrofit就是对okhttp做了一层封装。把网络请求都交给给了Okhttp,我们只需要通过简单的配置就能使用retrofit来进行网络请求了
首先在你的Grandle中引入Retrofit2.0,
https://github.com/square/retrofit 官方Git库 http://square.github.io/retrofit/ 官网
compile'com.squareup.retrofit2:retrofit:2.0.2'
compile 'com.squareup.retrofit2:converter-gson:2.0.0-beta3'
然后创建一个retrofit
Retrofit retrofit = new Retrofit.Builder().baseUrl("你的BaseUrl")
//retrofit已经把Json解析封装在内部了 你需要传入你想要的解析工具就行了 默认支持Gson解析
.addConverterFactory("GsonConverterFactory.creat()")
.client(new OkHttpClient()).build();
HttpInterface httpStores = retrofit.create(HttpInterface.class);
ApiInterface.class相当于是我们的接口请求库
POST请求示例
public interface ApiInterface {
@FormUrlEncoded
@POST("login/app/user")
Call<DiaoChaBiaoRespsone> getUser(
@FieldMap Map<String, String> hashMap );
}
这里的UserInfo就是接口给你返回的Json解析实体
Call<UserInfo> call = httpStores.getUser(hashMap);
Get请求
public interface ApiInterface {
@GET("login/code/{uid}.html")
Call<ResponseBody> getUser(
@Path("cityId") String cityId);}
}
Call<UserInfo> call = httpStores.getUser("123456");
准备完以上这些之后你是不是对这行代码很有疑惑 HttpInterface httpStores = retrofit.create(HttpInterface.class);下面我们就来简单的说一下 *
先上源码
大家一看就发现了 create方法返回了一个动态代理对象,那么动态代理是什么呢 :
---在运行时, 动态代理类 实现了一个或者一组接口,目的是,其中任何一个接口的实例的方法调用将会被指派到统一的另一个接口的方法中。
** InvocationHandler 中覆写的 invoke() 方法,在进行原本的方法调用之前或者之后,可以做点事情。**
所以当我们调用* httpStores.getUser(hashMap);*的时候其实是走了动态代理的invoke方法,在这里Retrofit巧妙的理由注解把接口转换成了一个HTTP请求
大概了解了create方法那我们就可以执行请求了,最后一步
call.enqueue(new Callback<Object>() {
@Override
public void onResponse(
Call<Object> call, Response<Object> response) {
}
@Override public void onFailure(Call<Object> call, Throwable t) {
}});
到这里就是大家熟悉的了 请求成功Response 失败onFailure Object就是你事先定义好的JSON解析类了
是不是很简单而且很优雅
当然Retrofit的内部实现更优雅使用了很多设计模式这里推荐一位大神的文章Retrofit用到的设计模式
Retrofit还有很多功能没有说完,不过要是着急尝尝鲜的朋友上面已经可以去试试了
下面在说一下Okhttp的拦截器Interceptor 这真的是一个用起来非常爽的东西实现起来也非常简单
上代码
public class OkhttpInterceptor implements Interceptor {
@Override
public Response intercept(Interceptor.Chain chain) throws IOException {
//取到当前请求的Requset
Request oldRequest = chain.request();
//取到请求的URL ,对你的URL进行修改,比如拼接一个UID什么的
//也可以使用addQueryParameter拼接参数
String url = oldRequest.url().toString()+"?="+uid;
Request newRequest = oldRequest.newBuilder()
.method(oldRequest.method(), oldRequest.body())
.url(url)
.build();
return chain.proceed(newRequest); }
}
当然你也可以增加请求参数
HttpUrl.Builder urlBuilder = oldRequest.url()newBuilder()
.scheme(oldRequest.url().scheme()) .addQueryParameter("key", "value")
只需要把url里的参数改为urlBuilder就行了
当然具体的业务需求也会遇到一些问题比如当我们的后台用的是https的时候,需要用到自签名证书,而OKhttp3已经没有了setCertificates设置自签名证书时怎么办,没关系我们还有万能的反射呢,下面我们就利用反射把https给过滤掉
SSLContext sc = null;
try {
sc = SSLContext.getInstance("SSL");
sc.init(null, new TrustManager[]{new X509TrustManager() {
@Override
public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) throws java.security.cert.CertificateException { }
@Override
public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) throws java.security.cert.CertificateException { }
@Override
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return null; } }
},
new SecureRandom());
} catch (Exception e) {
e.printStackTrace();
}
HostnameVerifier hv1 = new HostnameVerifier() {
@Override
public boolean verify(String hostname, SSLSession session) {
return true;
}};
String workerClassName = "okhttp3.OkHttpClient";
try {
sClient = new OkHttpClient.Builder().build();
Class workerClass = Class.forName(workerClassName);
Field hostnameVerifier = workerClass.getDeclaredField("hostnameVerifier"); hostnameVerifier.setAccessible(true);
hostnameVerifier.set(sClient, hv1);
Field sslSocketFactory = workerClass.getDeclaredField("sslSocketFactory"); sslSocketFactory.setAccessible(true);
sslSocketFactory.set(sClient, sc.getSocketFactory());
} catch (Exception e) {
e.printStackTrace();
}
当然对于强大Retrofit我们现在只是管中窥豹,要想更深入了解的同学需要下去之后一步一步的debug慢慢研究了,不过不管怎么说这么爽的网络请求库你是不应该错过的了!