




版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、Retrofit 和Java領域的ORM概念類似, ORM把結構化數(shù)據(jù)轉換為Java對象,而Retrofit 把REST API返回的數(shù)據(jù)轉化為Java對象方便操作。同時還封裝了網(wǎng)絡代碼的調(diào)用。例如:public interface GitHubService GET("/users/user/repos") List<Repo> listRepos(Path("user") String user);定義上面的一個REST API接口。 該接口定義了一個函數(shù) listRepos , 該函數(shù)會通過HTTP
2、GET請求去訪問服務器的/users/user/repos路徑并把返回的結果封裝為List<Repo> Java對象返回。其中URL路徑中的user的值為listRepos 函數(shù)中的參數(shù) user的取值。然后通過 RestAdapter 類來生成一個 GitHubService 接口的實現(xiàn);GitHubService service = restAdapter.create(GitHubService.class);獲取接口的實現(xiàn)后就可以調(diào)用接口函數(shù)來和服務器交互了;List<Repo&g
3、t; repos = service.listRepos("octocat");從上面的示例可以看出, Retrofit 使用注解來聲明HTTP請求1.支持 URL 參數(shù)替換和查詢參數(shù)2.返回結果轉換為Java對象(返回結果可以為 JSON, protocol buffers)3.支持 Multipart請求和文件上傳具體使用文檔函數(shù)和函數(shù)參數(shù)上的注解聲明了請求方式請求方式每個函數(shù)都必須帶有 HTTP 注解來表明請求方式和請求的URL路徑。類庫中有5個HTTP注解: GET , POST ,
4、0; PUT , DELETE , 和 HEAD。 注解中的參數(shù)為請求的相對URL路徑。GET("/users/list")在URL路徑中也可以指定URL參數(shù)GET("/users/list?sort=desc")URL處理請求的URL可以根據(jù)函數(shù)參數(shù)動態(tài)更新。一個可替換的區(qū)塊為用 和 包圍的字符串,而函數(shù)參數(shù)必需用 Path 注解表明,并且注解的參數(shù)為同樣的字符串GET("
5、;/group/id/users") /注意 字符串idList<User> groupList(Path("id") int groupId); /注意 Path注解的參數(shù)要和前面的字符串一樣 id還支持查詢參數(shù)GET("/group/id/users")List<User> groupList(Path("id") int groupId, Query("sort") String sort);請求體(Request Body)通過 Body
6、 注解可以聲明一個對象作為請求體發(fā)送到服務器。POST("/users/new")void createUser(Body User user, Callback<User> cb);對象將被 RestAdapter 使用對應的轉換器轉換為字符串或者字節(jié)流提交到服務器。FORM ENCODED AND MULTIPART 表單和Multipart函數(shù)也可以注解為發(fā)送表單數(shù)據(jù)和multipart 數(shù)據(jù)使用 FormUrlEncoded 注解來發(fā)送表單數(shù)據(jù);使用
7、0;Field 注解和參數(shù)來指定每個表單項的Key,value為參數(shù)的值。FormUrlEncodedPOST("/user/edit")User updateUser(Field("first_name") String first, Field("last_name") String last);使用 Multipart 注解來發(fā)送multipart數(shù)據(jù)。使用 Part 注解定義要發(fā)送的每個文件。MultipartPUT("
8、/user/photo")User updateUser(Part("photo") TypedFile photo, Part("description") TypedString description);Multipart 中的Part使用 RestAdapter 的轉換器來轉換,也可以實現(xiàn) TypedOutput 來自己處理序列化。異步 VS 同步每個函數(shù)可以定義為異步或者同步。具有返回值的函數(shù)為同步執(zhí)行的。GET("/user/id/photo&qu
9、ot;)Photo listUsers(Path("id") int id);而異步執(zhí)行函數(shù)沒有返回值并且要求函數(shù)最后一個參數(shù)為Callback對象GET("/user/id/photo")void listUsers(Path("id") int id, Callback<Photo> cb);在 Android 上,callback對象會在主(UI)線程中調(diào)用。而在普通Java應用中,callback在請求執(zhí)行的線程中調(diào)用。服務器結果轉換為Java對象使用RestAdapter的轉換器把HTTP請求結果(默認為JSON
10、)轉換為Java對象,Java對象通過函數(shù)返回值或者Callback接口定義GET("/users/list")List<User> userList();GET("/users/list")void userList(Callback<List<User>> cb);如果要直接獲取HTTP返回的對象,使用 Response 對象。GET("/users/list")Response userList();GET("/users/list&quo
11、t;)void userList(Callback<Response> cb);項目主頁: http:/square.github.io/retrofit/參考項目: http:/square.github.io/okhttp/Android 示例項目: Retrofit在項目中的應用定義一個注解,用來對bean進行要序列化的字段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. 將注解對需要網(wǎng)絡傳輸bean進行標注: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. 把定義好的注解封裝進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自定義工具類 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工具將以上兩個工具配置到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地址);/設置遠程地址 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. 那么工具集準備好了,使用retrofit放在父類以便子類調(diào)用java view plaincopy1. import retrofit.Callback; 2. import retrofit.RetrofitError; 3. import retrofit.client.Respo
46、nse;/* 4. * 界面的基類 5. */ 6. public class BaseActivity extends ActionBarActivity 7. 8. . 9. 10. /* 11. * 創(chuàng)建API實例 12.
47、 * 13. * param cls Api定義類的類型 14. * param <T> 范型 15. * return API實例 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>/軟引用,緩存引用對象 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. 定義下面的一個REST API接口。 該接口定義了一個函數(shù) ask, 該函數(shù)會通過HTTP post請求去訪問服務器的/el
61、lassy/teacher/ask路徑并把返回的結果封裝為requestBean Java對象返回。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客戶端請求服
65、務端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)接口返回從服務器返回的數(shù)據(jù)&
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 初一上學期長郡數(shù)學試卷
- 高級瓦楞紙板及紙箱生產(chǎn)項目環(huán)評報告表
- 通信電纜施工方案
- 2024-2025學年下學期高一語文第二單元B卷
- 柴油裝卸系統(tǒng)施工方案
- 【專精特新】稀土永磁材料企業(yè)專精特新“小巨人”成長之路(智研咨詢)
- 信息技術下的立體幾何教學初探
- 高中歷史課堂教學情境創(chuàng)設的策略研究
- 南京科遠KD200變頻器使用手冊
- 中外教育史知到課后答案智慧樹章節(jié)測試答案2025年春牡丹江師范學院
- 2025年鐵嶺衛(wèi)生職業(yè)學院單招職業(yè)傾向性測試題庫學生專用
- (一模)2025屆安徽省“江南十?!备呷?lián)考地理試卷(含官方答案)
- 數(shù)學-2025屆安徽省江南十校聯(lián)考試題和解析
- 2025年遼寧現(xiàn)代服務職業(yè)技術學院單招職業(yè)技能測試題庫(含答案)
- 高考模擬作文“中國游”“city不city”導寫及范文
- 福建省福州市2024-2025學年九年級上學期期末語文試題(解析版)
- 普通高中學生綜合素質(zhì)評價自我陳述報告
- 2025年江西電力職業(yè)技術學院高職單招職業(yè)適應性測試近5年??及鎱⒖碱}庫含答案解析
- 2025年吉安職業(yè)技術學院高職單招職業(yè)技能測試近5年??及鎱⒖碱}庫含答案解析
- 《展示設計》課件-第一章 展示設計概述
- 建筑施工安全管理存在的問題及對策【15000字(論文)】
評論
0/150
提交評論