AndroidRetrofitService
前言
该项目主要实现Android移动端与RestAPI后台的交互过程
方案一:可以使用HTTPClient自己去实现,不过复杂度和情况需要逐一去考虑,我写过一个简单的demo:
https://github.com/Vence/AndroidAPIService<
方案二:这里主要介绍使用类库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 }