Android端使用Retrofit實現與RestAPI後臺進行數據交互

AndroidRetrofitService

前言

該項目主要實現Android移動端與RestAPI後臺的交互過程

方案一:能夠使用HTTPClient本身去實現,不過複雜度和狀況須要逐一去考慮,我寫過一個簡單的demo:
javascript

    https://github.com/Vence/AndroidAPIService&ltjava

方案二:這裏主要介紹使用類庫Retrofit框架去實現RestAPI交互過程。 git

關於Retrofit

關於這個類庫,這裏很少介紹,請參見
  http://square.github.io/retrofit/
官網上的一句歸納Retrofit用途的話,這裏引用過來  github

   A type-safe HTTP client for Android and Java
json

使用過程

- RestAdapter使用單例模式api

 1  public static RestAdapter  getInstance (){
 2         
 3             if(instance == null) {
 4                 synchronized (RestAdapterManager.class) {
 5                     if (instance == null)
 6                         
 7                         gson = new GsonBuilder()
 8                             .registerTypeAdapterFactory(new ItemTypeAdapterFactory())
 9                             .create();
10                         
11                         instance  = new RestAdapter.Builder()
12                             .setEndpoint(HttpAPIUtil.getInstance().getEndpoint())
13                             .setConverter(new GsonConverter(gson))
14                             .build();
15                 }
16             }
17             
18             return instance;
19              
20         }

- 聲明接口和實現框架


LoginHttpService

dom

 1  @POST("/api/{domainid}/loginnocaptcha")
 2     public void login(@Path("domainid")String domainID , @QueryMap Map<String , String> options , Callback<String> cb);
 3 
 4 LoginService
 5 
 6     public void login(String domainID , String userName , String password , Callback<String> cb);
 7     
 8 LoginServiceImpl
 9 
10     private LoginHttpService loginHttpService = 
11         RestAdapterManager.getInstance().create(LoginHttpService.class);


LoginHttpService是給Retrofit框架使用的,內部用動態代理實現了這個接口的具體實現,因此這裏不須要去寫LoginHttpService的實現。(有關動態代理知識,請參見ide

http://vence.gitcafe.io/blog/2015/08/04/java-proxy-info/
在LoginServiceImpl 中調用了RestAdapter去建立LoginHttpService的一個實現


- 另外須要說明的一點是,Retrofit提供了自定義的json解析,restApi返回的格式不一樣,這裏的解析也會有所差別

好比個人restApi返回數據的格式是

ui

 {errorCode: 0 , errorMsg: null, result: [...]}

 

 

 

因此這裏只有result是對咱們有用的數據,這裏解析以下:

    

 1  public class ItemTypeAdapterFactory implements TypeAdapterFactory {
 2 
 3         public <T> TypeAdapter<T> create(Gson gson , final TypeToken<T> type){
 4             
 5             final TypeAdapter<T> delegate = gson.getDelegateAdapter(this, type);
 6             final TypeAdapter<JsonElement> elementAdapter = gson.getAdapter(JsonElement.class);
 7             
 8             
 9             return new TypeAdapter<T>(){
10     
11                 @Override
12                 public T read(JsonReader in) throws IOException {
13                     
14                     JsonElement jsonElement = elementAdapter.read(in);
15                     
16                     if (jsonElement.isJsonObject()) {
17                         JsonObject jsonObject = jsonElement.getAsJsonObject();
18                         
19                         if (jsonObject.has("errorCode")
20                                 && jsonObject.get("errorCode").getAsInt() != 0) {
21                         
22                             throw new IllegalArgumentException(jsonObject.get("errorMsg").getAsString());
23                     
24                         } 
25                         if (jsonObject.has("result")) {
26                             
27                             return delegate.fromJsonTree(jsonObject.get("result"));
28                             
29                         }
30                             
31                     }
32                     
33                     return delegate.fromJsonTree(jsonElement);
34                 }
35     
36                 @Override
37                 public void write(JsonWriter out, T value) throws IOException {
38                     // TODO Auto-generated method stub
39                     delegate.write(out, value);
40                     
41                 }}.nullSafe();
42         }
43     }
相關文章
相關標籤/搜索