Retrofit–Java(Android)的REST接口封裝類(lèi)庫(kù)_第1頁(yè)
Retrofit–Java(Android)的REST接口封裝類(lèi)庫(kù)_第2頁(yè)
Retrofit–Java(Android)的REST接口封裝類(lèi)庫(kù)_第3頁(yè)
Retrofit–Java(Android)的REST接口封裝類(lèi)庫(kù)_第4頁(yè)
Retrofit–Java(Android)的REST接口封裝類(lèi)庫(kù)_第5頁(yè)
已閱讀5頁(yè),還剩7頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、Retrofit   和Java領(lǐng)域的ORM概念類(lèi)似, ORM把結(jié)構(gòu)化數(shù)據(jù)轉(zhuǎn)換為Java對(duì)象,而Retrofit 把REST API返回的數(shù)據(jù)轉(zhuǎn)化為Java對(duì)象方便操作。同時(shí)還封裝了網(wǎng)絡(luò)代碼的調(diào)用。例如:public interface GitHubService GET("/users/user/repos") List<Repo> listRepos(Path("user") String user);定義上面的一個(gè)REST API接口。 該接口定義了一個(gè)函數(shù) listRepos ,  該函數(shù)會(huì)通過(guò)HTTP

2、GET請(qǐng)求去訪(fǎng)問(wèn)服務(wù)器的/users/user/repos路徑并把返回的結(jié)果封裝為L(zhǎng)ist<Repo> Java對(duì)象返回。其中URL路徑中的user的值為listRepos 函數(shù)中的參數(shù) user的取值。然后通過(guò)  RestAdapter  類(lèi)來(lái)生成一個(gè)  GitHubService  接口的實(shí)現(xiàn);GitHubService service = restAdapter.create(GitHubService.class);獲取接口的實(shí)現(xiàn)后就可以調(diào)用接口函數(shù)來(lái)和服務(wù)器交互了;List<Repo&g

3、t; repos = service.listRepos("octocat");從上面的示例可以看出, Retrofit 使用注解來(lái)聲明HTTP請(qǐng)求1.支持 URL 參數(shù)替換和查詢(xún)參數(shù)2.返回結(jié)果轉(zhuǎn)換為Java對(duì)象(返回結(jié)果可以為  JSON, protocol buffers)3.支持 Multipart請(qǐng)求和文件上傳具體使用文檔函數(shù)和函數(shù)參數(shù)上的注解聲明了請(qǐng)求方式請(qǐng)求方式每個(gè)函數(shù)都必須帶有 HTTP 注解來(lái)表明請(qǐng)求方式和請(qǐng)求的URL路徑。類(lèi)庫(kù)中有5個(gè)HTTP注解:  GET ,  POST ,

4、0; PUT ,  DELETE , 和  HEAD。 注解中的參數(shù)為請(qǐng)求的相對(duì)URL路徑。GET("/users/list")在URL路徑中也可以指定URL參數(shù)GET("/users/list?sort=desc")URL處理請(qǐng)求的URL可以根據(jù)函數(shù)參數(shù)動(dòng)態(tài)更新。一個(gè)可替換的區(qū)塊為用   和   包圍的字符串,而函數(shù)參數(shù)必需用  Path 注解表明,并且注解的參數(shù)為同樣的字符串GET("

5、;/group/id/users") /注意 字符串idList<User> groupList(Path("id") int groupId); /注意 Path注解的參數(shù)要和前面的字符串一樣 id還支持查詢(xún)參數(shù)GET("/group/id/users")List<User> groupList(Path("id") int groupId, Query("sort") String sort);請(qǐng)求體(Request Body)通過(guò)   Body 

6、 注解可以聲明一個(gè)對(duì)象作為請(qǐng)求體發(fā)送到服務(wù)器。POST("/users/new")void createUser(Body User user, Callback<User> cb);對(duì)象將被  RestAdapter 使用對(duì)應(yīng)的轉(zhuǎn)換器轉(zhuǎn)換為字符串或者字節(jié)流提交到服務(wù)器。FORM ENCODED AND MULTIPART 表單和Multipart函數(shù)也可以注解為發(fā)送表單數(shù)據(jù)和multipart 數(shù)據(jù)使用  FormUrlEncoded  注解來(lái)發(fā)送表單數(shù)據(jù);使用 

7、0;Field 注解和參數(shù)來(lái)指定每個(gè)表單項(xiàng)的Key,value為參數(shù)的值。FormUrlEncodedPOST("/user/edit")User updateUser(Field("first_name") String first, Field("last_name") String last);使用  Multipart  注解來(lái)發(fā)送multipart數(shù)據(jù)。使用  Part  注解定義要發(fā)送的每個(gè)文件。MultipartPUT("

8、/user/photo")User updateUser(Part("photo") TypedFile photo, Part("description") TypedString description);Multipart 中的Part使用  RestAdapter  的轉(zhuǎn)換器來(lái)轉(zhuǎn)換,也可以實(shí)現(xiàn) TypedOutput  來(lái)自己處理序列化。異步 VS 同步每個(gè)函數(shù)可以定義為異步或者同步。具有返回值的函數(shù)為同步執(zhí)行的。GET("/user/id/photo&qu

9、ot;)Photo listUsers(Path("id") int id);而異步執(zhí)行函數(shù)沒(méi)有返回值并且要求函數(shù)最后一個(gè)參數(shù)為Callback對(duì)象GET("/user/id/photo")void listUsers(Path("id") int id, Callback<Photo> cb);在 Android 上,callback對(duì)象會(huì)在主(UI)線(xiàn)程中調(diào)用。而在普通Java應(yīng)用中,callback在請(qǐng)求執(zhí)行的線(xiàn)程中調(diào)用。服務(wù)器結(jié)果轉(zhuǎn)換為Java對(duì)象使用RestAdapter的轉(zhuǎn)換器把HTTP請(qǐng)求結(jié)果(默認(rèn)為JSON

10、)轉(zhuǎn)換為Java對(duì)象,Java對(duì)象通過(guò)函數(shù)返回值或者Callback接口定義GET("/users/list")List<User> userList();GET("/users/list")void userList(Callback<List<User>> cb);如果要直接獲取HTTP返回的對(duì)象,使用  Response  對(duì)象。GET("/users/list")Response userList();GET("/users/list&quo

11、t;)void userList(Callback<Response> cb);項(xiàng)目主頁(yè):  http:/square.github.io/retrofit/參考項(xiàng)目: http:/square.github.io/okhttp/Android 示例項(xiàng)目:  Retrofit在項(xiàng)目中的應(yīng)用定義一個(gè)注解,用來(lái)對(duì)bean進(jìn)行要序列化的字段java view plaincopy1. import java.lang.annotation.Documented;  2. import jav

12、a.lang.annotation.ElementType;  3. import java.lang.annotation.Retention;  4. import java.lang.annotation.RetentionPolicy;  5. import java.lang.annotation.Target;  6.   7. /* 8.  * 用于Gson命名策略的注解 9.  */ 

13、60;10. Documented  11. Retention(RetentionPolicy.RUNTIME)  12. Target(ElementType.FIELD)  13. public interface ParamName   14.   15.     String value();  16.   將注解對(duì)需要網(wǎng)絡(luò)傳輸bean進(jìn)行標(biāo)注:java v

14、iew plaincopy1. public class requestBean implements Parcelable   2. public static final int RESPONSE_OK = 1;  3. ParamName("id")   4. private String mId;  5. ParamName("name&q

15、uot;)   6. private String mName;  7. ParamName("result")  8. private int mResult;  9. ParamName("message")  10. private String mMessage;  11. public int getResult()  

16、; 12. return mResult;  13.   14. public String getMessage()   15. return mMessage;  16.   17. public String getId()   18.   19. return mId;  20.    21. pub

17、lic String getName()   22.    23. return mName;   24.   25. public boolean succeed()   26. return getResult() = RESPONSE_OK;  27.   28.   把定義好的注解封裝進(jìn)gsonjava

18、0;view plaincopy1. import com.google.gson.FieldNamingPolicy;  2. import com.google.gson.FieldNamingStrategy;  3. import com.google.gson.Gson;  4. import com.google.gson.GsonBuilder;  5.   6. import com.newandbie.privatecustom

19、ize.Config;  7. import com.newandbie.privatecustomize.annotate.ParamName;  8. import com.newandbie.privatecustomize.model.Gender;  9.   10. import java.lang.reflect.Field;  11.   12. /* 13.  * 自定義的Gson 14.

20、  */  15. public class GsonUtils   16.   17.     public static Gson newInstance()   18.         GsonBuilder builder = new GsonBuilder();

21、0; 19.   20.         builder.setFieldNamingStrategy(new AnnotateNaming();  21.          22.         return builder.create();  23.

22、      24.   25.     private static class AnnotateNaming implements FieldNamingStrategy   26.   27.         Override  28.    &

23、#160;    public String translateName(Field field)   29.             ParamName a = field.getAnnotation(ParamName.class);  30.       

24、0;     return a != null ? a.value() : FieldNamingPolicy.IDENTITY.translateName(field);  31.           32.       33.   java view plainco

25、py1. import com.squareup.okhttp.Cache;  2. import com.squareup.okhttp.OkHttpClient;  3.   4. import android.content.Context;  5.   6. import java.io.File;  7. import java.io.IOException;  8. import ja

26、va.util.concurrent.TimeUnit;  9.   10. /* 11.  * OkHttpClient自定義工具類(lèi) 12.  */  13. public class OkHttpUtils   14.   15.     private static OkHttpClient singleton;  16.

27、   17.     public static OkHttpClient getInstance(Context context)   18.         if (singleton = null)   19.          &#

28、160;  synchronized (OkHttpUtils.class)   20.                 if (singleton = null)   21.             

29、;        File cacheDir = new File(context.getCacheDir(), Config.RESPONSE_CACHE);  22.   23.                     sin

30、gleton = new OkHttpClient();  24.                     try   25.                 

31、        singleton.setCache(new Cache(cacheDir, Config.RESPONSE_CACHE_SIZE);  26.                      catch (IOException e)&#

32、160;  27.                         e.printStackTrace();  28.                 

33、0;     29.                     singleton.setConnectTimeout(Config.HTTP_CONNECT_TIMEOUT, TimeUnit.MILLISECONDS);  30.        &

34、#160;            singleton.setReadTimeout(Config.HTTP_READ_TIMEOUT, TimeUnit.MILLISECONDS);  31.                   32.   

35、0;           33.           34.         return singleton;  35.       36.   定義Retrofit工具將以上兩個(gè)工具配置到Retr

36、ofitUtilsjava view plaincopy1. import android.content.Context;  2.   3. import retrofit.RestAdapter;  4. import retrofit.client.OkClient;  5. import retrofit.converter.GsonConverter;  6.   7. public class 

37、RetrofitUtils   8.   9.     private static RestAdapter singleton;  10.   11.     public static <T> T createApi(Context context, Class<T> clazz) 

38、0; 12.         if (singleton = null)   13.             synchronized (RetrofitUtils.class)   14.         &

39、#160;       if (singleton = null)   15.                     RestAdapter.Builder builder = new RestAdapter.Builder()

40、;  16.                     builder.setEndpoint(ip地址);/設(shè)置遠(yuǎn)程地址  17.                    

41、 builder.setConverter(new GsonConverter(GsonUtils.newInstance();  18.                     builder.setClient(new OkClient(OkHttpUtils.getInstance(context);  19.  

42、;                   builder.setLogLevel(  20.                          

43、;   Config.DEBUG ? RestAdapter.LogLevel.FULL : RestAdapter.LogLevel.NONE);  21.                     singleton = builder.build();  22. &

44、#160;                 23.               24.           25.       &

45、#160; return singleton.create(clazz);  26.       27.   那么工具集準(zhǔn)備好了,使用retrofit放在父類(lèi)以便子類(lèi)調(diào)用java view plaincopy1. import retrofit.Callback;  2. import retrofit.RetrofitError;  3. import retrofit.client.Respo

46、nse;/* 4.  * 界面的基類(lèi) 5.  */  6. public class BaseActivity extends ActionBarActivity   7.   8. .  9.   10.     /* 11.      * 創(chuàng)建API實(shí)例 12.  

47、    * 13.      * param cls Api定義類(lèi)的類(lèi)型 14.      * param <T> 范型 15.      * return API實(shí)例 16.      */  17. &#

48、160;   public  <T> T  createApi(Class<T> cls)   18.         return RetrofitUtils.createApi(this, cls);  19.       20.   21. 

49、0; 22.     public static abstract class ActivityCallback<T>  23.             implements Callback<T>   24.  <span style="white-space:pre

50、">   </span>/軟引用,緩存引用對(duì)象  25.         private final WeakReference<BaseActivity> mRef;  26.   27.   28.         public Activity

51、Callback(BaseActivity activity)   29.             mRef = new WeakReference<BaseActivity>(activity);  30.           31.   32. 

52、0; 33.         public Activity getActivity()   34.             return mRef.get();  35.           36. 

53、0; 37.   38.         Override  39.         public void failure(RetrofitError error)   40.             fin

54、al BaseActivity activity = mRef.get();  41.              42.                  43.       &#

55、160;         Response response = error.getResponse();  44.                 if (response != null)   45.    

56、;                 Toast.makeText(activity, activity.getString(R.string.server_error),  46.                   &

57、#160;         Toast.LENGTH_SHORT).show();  47.                     Log.e(getLogTag(),  48.        &#

58、160;                    "code:" + response.getStatus() + ", reason:" + response.getReason();  49.       &

59、#160;             error.printStackTrace();  50.                   51.            

60、;   52.           53.   54.   55.       56.   57. .  58.     59.   定義下面的一個(gè)REST API接口。 該接口定義了一個(gè)函數(shù) ask,  該函數(shù)會(huì)通過(guò)HTTP post請(qǐng)求去訪(fǎng)問(wèn)服務(wù)器的/el

61、lassy/teacher/ask路徑并把返回的結(jié)果封裝為requestBean Java對(duì)象返回。java view plaincopy1. import retrofit.Callback;  2. import retrofit.http.Field;  3. import retrofit.http.FormUrlEncoded;  4. import retrofit.http.Header;  5. import retrofit.h

62、ttp.POST;  6.   7. public interface ExpertApi   8.   9.     FormUrlEncoded  10.     POST("/ellassy/teacher/ask")  11.     void ask(Header("token&

63、quot;) String token, Field("member_id") String memberId,  12.             Field("title") String title, Field("description") String description, &

64、#160;13.             Field("teacher_id") String expertId,  14.             Callback<requestBean> cb);  15.   rect客戶(hù)端請(qǐng)求服

65、務(wù)端java view plaincopy1. import android.content.Context;  2. import android.content.Intent;  3. import android.os.Bundle;  4. import android.view.View;  5. import android.widget.Button;  6. import android.widget.Edit

66、Text;  7. import android.widget.Toast;  8.   9. import retrofit.client.Response;  10.   11. public class AskActivity extends implements View.OnClickListener   12.   13.    

67、60;private ExpertApi mExpertApi;  14.   15.    /.  16.   17.   18.     Override  19.     protected void onCreate(Bundle savedInstanceState)   20.

68、         super.onCreate(savedInstanceState);  21.   22.        / .  23.   24.         mExpertApi = createApi(ExpertApi.class);

69、0; 25.       26.   27.     Override  28.     public void onClick(View v)   29.        /.調(diào)用rest 接口  30.    

70、0;    mExpertApi.ask(getToken(), mUserInfo.getId(), title, question, mExpertId,  31.                 new AskCallback(AskActivity.this);  32.       33. /回調(diào)接口返回從服務(wù)器返回的數(shù)據(jù)&

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論