30分鐘上手最火android網絡請求框架Retrofit

說到目前最火的網絡請求庫,那肯定是的非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);*下面我們就來簡單的說一下
先上源碼


Paste_Image.png

大家一看就發現了 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慢慢研究了,不過不管怎麼說這麼爽的網絡請求庫你是不應該錯過的了!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章