版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度電子工程師技術(shù)轉(zhuǎn)移及保密協(xié)議3篇
- 二零二五年度志愿者服務(wù)協(xié)議范本:環(huán)保志愿者服務(wù)協(xié)議書(shū)3篇
- 二零二五年度綠色頁(yè)巖磚高品質(zhì)采購(gòu)與銷(xiāo)售合作協(xié)議3篇
- 二零二五年度輔導(dǎo)員工作績(jī)效評(píng)估合同3篇
- 2025淺談建設(shè)工程施工合同管理
- 2025公司商業(yè)機(jī)密勞動(dòng)合同范本
- 中央空調(diào)購(gòu)銷(xiāo)安裝合同
- 2025分包合同(建筑安裝工程)
- 三人修廠(chǎng)合伙協(xié)議
- 通信基站設(shè)備維護(hù)操作標(biāo)準(zhǔn)
- 河北省百師聯(lián)盟2023-2024學(xué)年高二上學(xué)期期末大聯(lián)考?xì)v史試題(解析版)
- 中央空調(diào)系統(tǒng)運(yùn)行與管理考核試卷
- 核電工程排水隧道專(zhuān)項(xiàng)施工方案
- 山西省呂梁市2023-2024學(xué)年高二上學(xué)期期末考試數(shù)學(xué)試題(解析版)
- 2024年市場(chǎng)運(yùn)營(yíng)部職責(zé)樣本(3篇)
- 2024體育活動(dòng)區(qū)鋪沙子(合同)協(xié)議
- 民辦學(xué)校招生教師培訓(xùn)
- 《中華人民共和國(guó)機(jī)動(dòng)車(chē)駕駛?cè)丝颇恳豢荚囶}庫(kù)》
- 2024年VB程序設(shè)計(jì):從入門(mén)到精通
- 2024年故宮文化展覽計(jì)劃:課件創(chuàng)意與呈現(xiàn)
- 煉鐵行業(yè)的安全生產(chǎn)與環(huán)境保護(hù)考核試卷
評(píng)論
0/150
提交評(píng)論