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

下載本文檔

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

文檔簡(jiǎn)介

1、Retrofit和Java領(lǐng)域的ORM既念類似,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 listRepos(Path(user ) String user);定義上面的一個(gè) REST API接口。該接口定義了一個(gè)函數(shù)listRepos ,該函數(shù)會(huì)通過HTTP GET請(qǐng)求去訪問服務(wù)器的/users/user/repos路徑并把返回的結(jié)果封裝為L(zhǎng)ist Java對(duì)象返回。其中U

2、RL路徑中的user的值為listRepos 函數(shù)中的參數(shù)user的取值。然后通過 RestAdapter類來生成一個(gè)GitHubService接口的實(shí)現(xiàn);GitHubService service = restAdapter.create (GitHubService.class);獲取接口的實(shí)現(xiàn)后就可以調(diào)用接口函數(shù)來和服務(wù)器交互了;List repos = service.listRepos(octocat);從上面的示例可以看出,Retrofit使用注解來聲明 HTTP青求1. 支持URL參數(shù)替換和查詢參數(shù)2. 返回結(jié)果轉(zhuǎn)換為 Java對(duì)象(返回結(jié)果可以為JSON, protocol b

3、uffers)3. 支持Multipart請(qǐng)求和文件上傳具體使用文檔函數(shù)和函數(shù)參數(shù)上的注解聲明了請(qǐng)求方式請(qǐng)求方式每個(gè)函數(shù)都必須帶有 HTTP注解來表明請(qǐng)求方式和請(qǐng)求的URL路徑。類庫中有 5個(gè)HTTP注解:GET ,POST,PUT ,DELETE ,和HEAD注解中的參數(shù)為請(qǐng)求的相對(duì)URL路徑。GET(/users/list)在URL路徑中也可以指定URL參數(shù)GET(/users/list?sort=desc)URL處理和 包圍的字符串,而函數(shù)參數(shù)必需用Path注解表明,并且注解的參數(shù)為同樣的字符串GET(/group/id/users/注意字符串idList groupList(Path(

4、id)int groupId); /注意Path注解的參數(shù)要和前面的字符串請(qǐng)求的URL可以根據(jù)函數(shù)參數(shù)動(dòng)態(tài)更新。一個(gè)可替換的區(qū)塊為用樣id還支持查詢參數(shù)GE(T/group/id/usersList groupList(Path( id)int groupId, Query( sort ) String sort );請(qǐng)求體(Request Body )通過Body注解可以聲明一個(gè)對(duì)象作為請(qǐng)求體發(fā)送到服務(wù)器。POST(/users/new) void createUser(Body User user, Callback cb);對(duì)象將被 RestAdapter 使用對(duì)應(yīng)的轉(zhuǎn)換器轉(zhuǎn)換為字符串或

5、者字節(jié)流提交到服務(wù)器。FORM ENCODED AND MULTIPART 表單和 Multipart函數(shù)也可以注解為發(fā)送表單數(shù)據(jù)和 multipart 數(shù)據(jù)使用FormUrlE ncoded注解來發(fā)送表單數(shù)據(jù);使用Field注解和參數(shù)來指定每個(gè)表單項(xiàng)的Key, value為參數(shù)的值。FormUrlEncodedPOST/user/editUser updateUser(Field (first_name ) String first,Field (last_name)String last );使用 Multipart注解來發(fā)送multipart數(shù)據(jù)。使用Part注解定義要發(fā)Part (de

6、scription ) TypedString des的轉(zhuǎn)換器來轉(zhuǎn)換,也可以實(shí)送的每個(gè)文件。MultipartPU T/user/photo)User updateUser( Part (photo ) TypedFile photo, cription);Multipart 中的 Part 使用 RestAdapter現(xiàn) TypedOutput來自己處理序列化。異步VS同步每個(gè)函數(shù)可以定義為異步或者同步。具有返回值的函數(shù)為同步執(zhí)行的。GET(/user/id/photoPhoto listUsers(Path(id ) int id);Callback 對(duì)象而異步執(zhí)行函數(shù)沒有返回值并且要求函

7、數(shù)最后一個(gè)參數(shù)為GET(/user/id/photovoid listUsers(Path(id ) int id, Callback cb);在An droid 上,callback 對(duì)象會(huì)在主(UI)線程中調(diào)用。而在普通 Java應(yīng)用中,callback在請(qǐng)求執(zhí)行的線程中調(diào)用。服務(wù)器結(jié)果轉(zhuǎn)換為 Java對(duì)象Java 對(duì)使用RestAdapter的轉(zhuǎn)換器把HTTP請(qǐng)求結(jié)果(默認(rèn)為 JSON轉(zhuǎn)換為Java對(duì)象,象通過函數(shù)返回值或者Callback接口定義GET(/users/list)List userList();GET(/users/list)void userList(CallbackL

8、ist cb);如果要直接獲取HTTP返回的對(duì)象,使用Resp on se對(duì)象。GET(/users/list)Response userList();GET(/users/list)void userList(Callback cb);項(xiàng)目主頁: http:/square.github.io/retrofit/參考項(xiàng)目:http:/square.github.io/okhttp/An droid 示例項(xiàng)目:Retrofit在項(xiàng)目中的應(yīng)用定義一個(gè)注解,用來對(duì)bean進(jìn)行要序列化的字段javaview plai ncopy1.importjava.lang.annotation.Document

9、ed;2.importjava.lang.annotation.ElementType;3.importjava.lang.annotation.Retention;4.importjava.lang.annotation.RetentionPolicy5. import java .1 ang.annotation.Target;6.7. /*8. *用于Gson命名策略的注解9. */10. Documented11. Retention (RetentionPolicy.RUNTIME)12. Target (ElementType.FIELD)13. public interface

10、ParamName 14.14. String value();15. 將注解對(duì)需要網(wǎng)絡(luò)傳輸bean進(jìn)行標(biāo)注:java view plai ncopy1.publicclass requestBeanimplements Parcelable 2.publicstatic finalint RESPONSE_OK = 1;3.ParamNameid)4.privateString mId;5.ParamNamename)6.privateString mName;7.ParamNameresult )8.privateint mResult;9.ParamNamemessage)10.priv

11、ateString mMessage;11.publicint getResult() 12.returnmResult;13.14.publicString getMessage() 15.returnmMessage;16.17.publicString getId()18.19.returnmid;20.21.publicString getName()22.23.returnmName;24.25.publicboolean succeed() 26.returngetResult() = RESPONSE_OK;27.28.把定義好的注解封裝進(jìn)gsonjava view plai n

12、copy1. import com.google.gson.FieldNamingPolicy;2. import com.google.gson.FieldNamingStrategy;3. import com.google.gson.Gson;4. import com.google.gson.GsonBuilder;5.5. import com.newandbie.privatecustomize.Config;6. import com.newandbie.privatecustomize.annotate.ParamName;7. import com.newandbie.pri

13、vatecustomize.model.Gender;9.8. import java.lang.reflect.Field;11.9. /*10. * 自定義的Gson11. */12. public class GsonUtils 16.13. public static Gson newInstance() 14. GsonBuilder builder =new GsonBuilder();19.15. builder.setFieldNamingStrategy(new AnnotateNaming();21.16. return builder.create();17. 24.18

14、. private static class AnnotateNaming implements FieldNamingStrategy 26.19. Override20. public String translateName(Field field) 21. ParamName a = field.getAnnotation(ParamName.class );22. return a != null ? a.value() : FieldNamingPolic yDENTITY.transl ateName(field);23. 24. 25. java view plai ncopy

15、1. import com.squareup.okhttp.Cache;2. import com.squareup.okhttp.OkHttpCIient;3.4.importandroid.content.Context;5.6.importjava.io.File;7.importjava.ioO Exception;8.importjava.util.concurrent.TimeUnit;9.10./*11.* OkHttpCIient自定義工具類12.*/13.publicclass OkHttpUtils 14.15.privatestatic OkHttpCIient sing

16、leton;16.17.public static OkHttpCIient getlnstance(Context context) 18.if (singleton =null ) 19.synchronized (OkHttpUtils.class ) 20.if (singleton =null ) 21.File cacheDir =new File(context.getCacheDir(), Config.RESPONSE_CACHE);22.23.singleton =new OkHttpCIient。;24.try 25.singleton.setCache(new Cach

17、e(cacheDir, Config.RESPONSE_CACHE_SIZE);26.catch (IOException e) 27.e.printStackTrace();28.29.singleton.setConnectTimeout(Config.HTTP_CONNECT_TIMEOUT,TimeUnit.MILLISECONDS);30.singleton.setReadTimeout(Config.HTTP_READ_TIMEOUT, TimeUnit.MILLISECONDS);4.return singleton;35.36.定義Retrofit工具將以上

18、兩個(gè)工具配置到RetrofitUtilsjavaview plai ncopy1. import android.content.Context;2.2. import retrofit.RestAdapter;4.importretrofit.client.OkClient;5.importretrofit.converter.GsonConverter;6.7.8publicclass RetrofitUtils 9.privatestatic RestAdapter singleton;10.11.public static T createApi(Context context, Cl

19、ass clazz) 12.if (singleton =null ) 13.synchronized (RetrofitUtils.class ) 14.if (singleton =null)15.RestAdapter.Builder builder =new RestAdapter.Builder。;16.builder.setEndpoint(ip地址);/設(shè)置遠(yuǎn)程地址17.builder.setConverter(new GsonConverter(GsonUtils.newlnstance();18.builder.setClient(new OkClient(OkHttpUti

20、ls.getlnstance(context);19.builder.setLogLevel(20.Config.DEBUG ? RestAdapter.LogLevel.FULL : RestAdapter.LogLevel.NONE);21.singleton = builder.build();5.return singleton.create(clazz);26.27.那么工具集準(zhǔn)備好了,使用retrofit放在父類以便子類調(diào)用java view plai ncopy1. importretrofit.Callback;2. importretrofit.Retro

21、fitError;3. importretrofit.client.Response;/*4. *界面的基類5. */6. public class BaseActivity extends ActionBarActivity 7./* 創(chuàng)建API實(shí)例* param cis Api定義類的類型* param 范型* return API實(shí)例*/public T createApi(Class cis) return RetrofitUtils.createApi(this , cis);public static abstract class ActivityCallbackimplement

22、s Callback / 軟弓丨用,緩存弓丨用對(duì)象private final WeakReference mRef;public ActivityCallback(BaseActivity activity) mRef =new WeakReference(activity);public Activity getActivity() return mRef.get();Overridepublic void failure(RetrofitError error) final BaseActivity activity = mRef.get();Response response = err

23、or.getResponse();if (response != null ) Toast.makeText(activity, activity.getString(R.string.ser ver_error),Toast.LENGTH_SHORT).show();Log.e(getLogTag(), reason:code: + response.getStatus() + esponse.getReason();7.38.3

24、1.error.printStackTrace();5. 56.5758.59. 定義下面的一個(gè)REST API接口。 該接口定義了一個(gè)函數(shù) ask,該函數(shù)會(huì)通過HTTP post 請(qǐng)求去訪問服務(wù)器的 ellassy/teacher/ask路徑并把返回的結(jié)果圭寸裝為requestBean Java對(duì)象返回java view plai ncopy1.importretrofit.Callback;2.importretrofit.http.Field;3.importretrofit.http.FormU

25、rlEncoded;4.importretrofit.http.Header;5.6importretrofit.http.POST;7.opublicinterfaceExpertApi 8.9.FormUrlEncoded10.POS (T/ellassy/teacher/ask)11.void ask( Header( token ) String token,Field (member_id)String memberid,12.Field (title) String title,Field (description)String description,13.Field (teac

26、her_id) String expertid,14.Callback cb);15.rect客戶端請(qǐng)求服務(wù)端javaview plai ncopy1. importandroid.content.Context;2. importandroid.content.Intent;3. importandroid.os.Bundle;4. importandroid.view.View;5. importandroid.widget.Button;.6.47.import android.widget.EditText;import android.widget.Toast;import retrofit.client.Resp

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論