AndroidRetrofitService

前言

该项目主要实现Android移动端与RestAPI后台的交互过程

方案一:可以使用HTTPClient自己去实现,不过复杂度和情况需要逐一去考虑,我写过一个简单的demo:

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

方案二:这里主要介绍使用类库Retrofit框架去实现RestAPI交互过程。

关于Retrofit

关于这个类库,这里不多介绍,请参见
  http://square.github.io/retrofit/
官网上的一句概括Retrofit用途的话,这里引用过来  

   A type-safe HTTP client for Android and Java

使用过程

- RestAdapter使用单例模式

 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

 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的实现。(有关动态代理知识,请参见

http://vence.gitcafe.io/blog/2015/08/04/java-proxy-info/
在LoginServiceImpl 中调用了RestAdapter去创建LoginHttpService的一个实现


- 另外需要说明的一点是,Retrofit提供了自定义的json解析,restApi返回的格式不同,这里的解析也会有所差异

比如我的restApi返回数据的格式是

 {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     }
posted on 2016-04-07 10:11  Happy~Life  阅读(1243)  评论(0编辑  收藏  举报