文章出處

什么是 Retrofit ?

Retrofit 是一套 RESTful架構的Android(Java) 客戶端實現,基于注解,提供 JSON to POJO(Plain OrdinaryJavaObject ,簡單 Java 對象),POJO to JSON,網絡請求(POST,GET, PUT,DELETE 等)封裝。

配置環境

在build.gradle中添加

.....//編譯RxJavacompile 'io.reactivex:rxjava:1.1.6'//編譯RxAndroidcompile 'io.reactivex:rxandroid:1.2.1'//編譯Retrofit及其相關庫,包括Gsoncompile 'com.squareup.okhttp3:okhttp:3.3.1'compile 'com.squareup.retrofit2:retrofit:2.1.0'compile 'com.squareup.retrofit2:converter-gson:2.1.0'compile 'com.squareup.retrofit2:adapter-rxjava:2.1.0'compile 'com.squareup.okhttp3:logging-interceptor:3.3.1'

說明:

Retrofit默認依賴于okhttp,所以需要集成okhttp。
API返回的數據為JSON格式,在此我使用的是Gson對返回數據解析.請使用最新版的Gson 。

接口

這里我們調試借助百度名人名言API

該接口的API主機地址為:http://apistore.baidu.com;
需要訪問的接口:avatardata/mingrenmingyan/lookup;

需要一個key等于apikey的Header和一個keyword等于名人名言的查詢關鍵字,而且該請求為GET請求.

接口返回json格式:

{    "total": 10,    "result": [        {            "famous_name": "佚名",            "famous_saying": "婚姻是一家私人專門銀行,存儲真愛和默契,提取幸福和快樂。夫妻雙方互為賬戶,且存折是活期的,可以隨存隨取,而家庭則是這家銀行里的柜臺,通過它,夫妻雙方可以把自己的喜怒哀樂盡情地存進對方的銀行里,并可隨時提取微笑、鼓勵、安慰、體貼、溫柔等利息。"        },        {            "famous_name": "英國",            "famous_saying": "真愛無坦途"        },        {            "famous_name": "狄太人",            "famous_saying": "一個人真愛的時候,甚至會想不到自己是愛著對方。"        },        {            "famous_name": "佚名",            "famous_saying": "所有的阻礙,全是對真愛的淬煉。"        },        {            "famous_name": "羅蘭",            "famous_saying": "當你真愛一個人的時候,你是會忘記自己的苦樂得失,而只是關心對方的苦樂得失的。"        },        {            "famous_name": "羅蘭",            "famous_saying": "當兩人之間有真愛情的時候,是不會考慮到年齡的問題,經濟的條件,相貌的美丑,個子的高矮,等等外在的無關緊要的因素的。假如你們之間存在著這種問題,那你要先問問自己,是否真正在愛才好。"        },        {            "famous_name": "佚名",            "famous_saying": "真正的勇氣是來自內心的真愛。"        },        {            "famous_name": "佚名",            "famous_saying": "天國般的幸福,存在于對真愛的希望。"        },        {            "famous_name": "狄太人",            "famous_saying": "一個人真愛的時候,甚至會想不到自己是愛著對方"        },        {            "famous_name": "Shakespeare",            "famous_saying": "通向真愛的路從無坦途。"        }    ],    "error_code": 0,    "reason": "Succes"}

定義實體類

我們根據上面API返回的json數據來創建一個Famous數據對象,我們可以利用AndroidStudio插件 GsonFormat 快速方便的將json數據轉為Java 對象。

Famous.java

public class Famous {    //下面變量的定義要與接口中的字段名字保持一致    public int total;    public int error_code;    public String reason;    public List result;    public static class FamousInfo {        public String famous_name;        public String famous_saying;    }}

注意:如果你的字段有跟json不一樣的,要在字段上面加注解@SerializedName,@SerializedName是指定Json格式中的Key名。

如上面的錯誤碼字段,你就像定義為code,而服務器返回的是error_code,這個時候就應該這么寫:

@SerializedName("error_code")  public int code;

使用

首先定義

public abstract class BaseApi {    public static final String API_SERVER = "服務器地址"    private static final OkHttpClient mOkHttpClient = new OkHttpClient();    private static Retrofit mRetrofit;    protected static Retrofit getRetrofit() {            if (Retrofit == null) {                Context context = Application.getInstance().getApplicationContext();                //設定30秒超時                mOkHttpClient.setConnectTimeout(30, TimeUnit.SECONDS);                //設置攔截器,以用于自定義Cookies的設置                mOkHttpClient.networkInterceptors()                            .add(new CookiesInterceptor(context));                //設置緩存目錄                File cacheDirectory = new File(context.getCacheDir()                                        .getAbsolutePath(), "HttpCache");                Cache cache = new Cache(cacheDirectory, 20 * 1024 * 1024);                mOkHttpClient.setCache(cache);                //構建Retrofit                mRetrofit = new Retrofit.Builder()                        //配置服務器路徑                        .baseUrl(API_SERVER + "/")                          //設置日期解析格式,這樣可以直接解析Date類型                        .setDateFormat("yyyy-MM-dd HH:mm:ss")                          //配置轉化庫,默認是Gson                     .addConverterFactory(GsonConverterFactory.create())                        //配置回調庫,采用RxJava                        .addCallAdapterFactory(RxJavaCallAdapterFactory.create())                        //設置OKHttpClient為網絡客戶端                        .client(mOkHttpClient)                        .build();            }            return mRetrofit;        }}

定義FamousApi

public class FamousApi extends BaseApi{    //定義接口    private interface FamousService {    @GET("/avatardata/mingrenmingyan/lookup")      Observable getFamousList(@Header("apiKey") String apiKey,                                       @Query("keyword") String keyword,                                       @Query("page") int page,                                       @Query("rows") int rows);      }    protected static final FamousService service = getRetrofit().create(FamousService.class);    public static Observable getFamousList(String apiKey,String keyword, int page, int rows){        return service.getFamousList(apiKey, keyword, page, rows);    }}

最終使用:

public void getFamousList(){    FamousApi.getFamousList("apiKey","人才",1,20)        .subscribeOn(Schedulers.io())        .observeOn(AndroidSchedulers.mainThread())        .subscribe(new Subscriber(){                        @Override                        public void onCompleted() {                                         }                                               @Override                        public void onError(Throwable e) {                                          }                                               @Override                        public void onNext(Famous famous) {                             List list = famous.result;                             //填充UI                                  }        });}

參考demo:https://github.com/jdsjlzx/RetrofitDemo

看文倉www.kanwencang.com網友整理上傳,為您提供最全的知識大全,期待您的分享,轉載請注明出處。
歡迎轉載:http://www.kanwencang.com/bangong/20170208/98667.html

文章列表




Avast logo

Avast 防毒軟體已檢查此封電子郵件的病毒。
www.avast.com


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()