該項目主要實現Android移動端與RestAPI後臺的交互過程
方案一:能夠使用HTTPClient本身去實現,不過複雜度和狀況須要逐一去考慮,我寫過一個簡單的demo:
javascript
https://github.com/Vence/AndroidAPIService<java
方案二:這裏主要介紹使用類庫Retrofit框架去實現RestAPI交互過程。 git
關於這個類庫,這裏很少介紹,請參見
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 }