Retrofit2.0 學(xué)習(xí)小記

Retrofit2.0 學(xué)習(xí)小記

來自官網(wǎng)的介紹:Retrofit turns your HTTP API into Java interface.Retrofit把HTTP API變成Java的接口。

1.基本用法

直接上代碼:比如我們使用豆瓣電影的Top250做測試鏈接,目標(biāo)地址為:https://api.douban.com/v2/movie/top250?start=0&count=10
導(dǎo)包:compile 'com.squareup.retrofit:retrofit:2.0.0-beta2'
首先要建這樣一個(gè)接口:
public interface MovieService{
@GET("top250")
Call<MovieEntity> getTopMovie(@Query("start")int start,@Query("count") int count);
}
然后你還需要創(chuàng)建一個(gè)Retrofit對象:
public static final String baseUrl="https://api.douban.com/v2/movie/";
Retrofit retrofit=new Retrofit.Builder()
.baseUrl(baseUrl)
.addConverterFactory(GsonConverterFactory.create())
.build();
再用這個(gè)Retrofit對象創(chuàng)建一個(gè)MovieService對象:
MovieService movieService=retrofit.create(MovieService.class);
Call<MovieEntity> call=movieService.getTopMovie(0,10);
//call.enqueue()異步請求,call.execute()同步請求
call.enqueue(new Callback<MovieEntity>(){
@Override
public void onResponse(Call<MovieEntity> call, Response<MovieEntity> response) {
result_TV.setText(response.body().toString());
}
@Override
public void onFailure(Call<MovieEntity> call, Throwable t) {
result_TV.setText(t.getMessage());
}
});
在這邊還可以移除一個(gè)請求:
Retrofit 1.x版本沒有直接取消正在進(jìn)行中任務(wù)的方法的浊猾,在2.x的版本中,Service的模式變成Call的形式的原因是為了讓正在進(jìn)行的事務(wù)可以被取消纳寂。要做到這點(diǎn)滤愕,只需要調(diào)用call.cancel()厂僧。
以上就是Retrofit2.0的基本用法了,下面講講它的詳細(xì)用法:

1.關(guān)于各種網(wǎng)絡(luò)請求的service

下面分為GET胆绊、POST氨鹏、DELETE和PUT的請求,說明@Path压状、@Query仆抵、@QueryMap、@Body何缓、@Filed的用法肢础。

GET

1.一個(gè)簡單的get請求:
http://102.10.10.132/api/News
@GET("News") Call<NewsBean> getItem();
2.URL中帶有參數(shù):http://102.10.10.132/api/News/{資訊id}
@GET("News/{newsId}")
Call<NewsBean> getItem(@Path("newsId") String newsId);
3.參數(shù)在URL問號之后:http://102.10.10.132/api/News?newsId={資訊id}
@GET("News")
Call<NewsBean> getItem(@Query("newsId") String newsId);
或者帶有兩個(gè)參數(shù):http://102.10.10.132/api/News?newsId={資訊id}&type={類型}
@GET("News")
Call<NewsBean> getItem(@Query("newsId") String newsId,@Query("type") type);
4.多個(gè)參數(shù)在URL問號之后,且個(gè)數(shù)不確定:
http://102.10.10.132/api/News?newsId={資訊id}&type={類型}...
@GET("News")
Call<NewsBean> getItem(@QueryMap Map<String, String> map);

POST

1.需要補(bǔ)全URL碌廓,post的數(shù)據(jù)只有一條reason:
http://102.10.10.132/api/Comments/{newsId}
@FormUrlEncoded
@POST("Comments/{newsId}")
Call<Comment> reportComment(@Path("newsId") String commentId,@Field("reason") String reason);
2.需要補(bǔ)全URL,問號后加入access_token剩盒,post的數(shù)據(jù)只有一條reason:
http://102.10.10.132/api/Comments/{newsId}?access_token={access_token}
@FormUrlEncoded
@POST("Comment/{newsId}")
Call<Comment> reportComment(@Path("newsId") String commentId,@Query("access_token") String access_token,@Field("reason") String reason);
3.需要補(bǔ)全URL谷婆,問號后加入access_token,post一個(gè)body(對象):
http://102.10.10.132/api/Comments/{newsId}?access_token={access_token}
@FormUrlEncoded
@POST("Comment/{newsId}")
Call<Comment> reportComment(@Path("newsId") String commentId,@Query("access_token") String access_token,@Body CommentBean bean);
關(guān)于DELETE和PUT方式由于使用較少辽聊,這里就不舉例了纪挎,可自行g(shù)oogle
總結(jié)
@Path:URL問號之前的參數(shù)
@Query:URL問號后面的參數(shù)
@QueryMap:相當(dāng)于多個(gè)@Query
@Field:用于POST請求,提交單個(gè)數(shù)據(jù)
@Body:相當(dāng)于多個(gè)@Field,以對象的形式提交
若需要重新定義接口地址跟匆,可以使用@Url,例如:
@GET
Call<MovieEntity> getTopMovie(@Url String url,@Query("start")int start,@Query("count") int count);

關(guān)于解析

在Retrofit2.0中异袄,Converter不再包含在packeage中了,需要自己添加Converter玛臂,不然的話Retrofit只能接收字符串結(jié)果烤蜕。同樣的,Retrofit也不再依賴于Gson迹冤,如果你想接收json結(jié)果并解析成DAO讽营,你必須把GsonConverter作為一個(gè)獨(dú)立的依賴添加進(jìn)來:compile 'com.squareup.retrofit:converter-gson:2.0.0-beta2' ,然后使用addConverterFactory(GsonConverterFactory.create())幫他添加進(jìn)來泡徙。
官方Converter modules列表
Gson: com.squareup.retrofit:converter-gson
Jackson: com.squareup.retrofit:converter-jackson
Moshi: com.squareup.retrofit:converter-moshi
Protobuf:com.squareup.retrofit:converter-protobuf
Wire: com.squareup.retrofit:converter-wire
Simple XML: com.squareup.retrofit:converter-simplexml
當(dāng)然也可以通過實(shí)現(xiàn)Converter.Factory接口來創(chuàng)建一個(gè)自定義的converter橱鹏。

2.Retrofit+RxJava(附上demo)

導(dǎo)包:
compile 'com.squareup.retrofit:adapter-rxjava:2.0.0-beta2'
compile 'io.reactivex:rxandroid:1.1.0'
在創(chuàng)建Retrofit的過程添加以下代碼:
Retrofit retrofit=new Retrofit.Builder()
.baseUrl(baseUrl) .addConverterFactory(GsonConverterFactory.create())
//結(jié)合RxJava .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.build();
這樣一來我們定義的Service返回值就不再是一個(gè)Call了,而是一個(gè)Observable堪藐,重新定義MovieService:
public interface MovieService {
@GET("top250")
Observable<MovieEntity> getTopMovie(@Query("start") int start, @Query("count") int count);
}
在網(wǎng)絡(luò)請求方法中改為:
//進(jìn)行網(wǎng)絡(luò)請求
private void getMovie(){

Retrofit retrofit = <span <span class="hljs-keyword">class</span>=<span class="hljs-string">"hljs-keyword"</span>><span class="hljs-keyword">new</span></span> Retrofit.Builder()
        .baseUrl(baseUrl)
        .addConverterFactory(GsonConverterFactory.create())
        .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
        .build();

MovieService movieService = retrofit.create(MovieService.class);

movieService.getTopMovie(<span <span class="hljs-keyword">class</span>=<span class="hljs-string">"hljs-number"</span>><span class="hljs-number">0</span></span>, <span <span class="hljs-keyword">class</span>=<span class="hljs-string">"hljs-number"</span>><span class="hljs-number">10</span></span>)
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(<span <span class="hljs-keyword">class</span>=<span class="hljs-string">"hljs-keyword"</span>><span class="hljs-keyword">new</span></span> Subscriber<MovieEntity>() {
            <span <span class="hljs-keyword">class</span>=<span class="hljs-string">"hljs-annotation"</span>>@Override</span>
            <span <span class="hljs-keyword">class</span>=<span class="hljs-string">"hljs-function"</span>><span <span class="hljs-keyword">class</span>=<span class="hljs-string">"hljs-keyword"</span>><span class="hljs-keyword">public</span></span> <span <span class="hljs-keyword">class</span>=<span class="hljs-string">"hljs-keyword"</span>><span class="hljs-keyword">void</span></span> <span <span class="hljs-keyword">class</span>=<span class="hljs-string">"hljs-title"</span>>onCompleted</span><span <span class="hljs-keyword">class</span>=<span class="hljs-string">"hljs-params"</span>>()</span> </span>{
                Toast.makeText(MainActivity.<span <span class="hljs-keyword">class</span>=<span class="hljs-string">"hljs-keyword"</span>><span class="hljs-keyword">this</span></span>, <span <span class="hljs-keyword">class</span>=<span class="hljs-string">"hljs-string"</span>><span class="hljs-string">"Get Top Movie Completed"</span></span>, Toast.LENGTH_SHORT).show();
            }

            <span <span class="hljs-keyword">class</span>=<span class="hljs-string">"hljs-annotation"</span>>@Override</span>
            <span <span class="hljs-keyword">class</span>=<span class="hljs-string">"hljs-function"</span>><span <span class="hljs-keyword">class</span>=<span class="hljs-string">"hljs-keyword"</span>><span class="hljs-keyword">public</span></span> <span <span class="hljs-keyword">class</span>=<span class="hljs-string">"hljs-keyword"</span>><span class="hljs-keyword">void</span></span> <span <span class="hljs-keyword">class</span>=<span class="hljs-string">"hljs-title"</span>>onError</span><span <span class="hljs-keyword">class</span>=<span class="hljs-string">"hljs-params"</span>>(Throwable e)</span> </span>{
                resultTV.setText(e.getMessage());
            }

            <span <span class="hljs-keyword">class</span>=<span class="hljs-string">"hljs-annotation"</span>>@Override</span>
            <span <span class="hljs-keyword">class</span>=<span class="hljs-string">"hljs-function"</span>><span <span class="hljs-keyword">class</span>=<span class="hljs-string">"hljs-keyword"</span>><span class="hljs-keyword">public</span></span> <span <span class="hljs-keyword">class</span>=<span class="hljs-string">"hljs-keyword"</span>><span class="hljs-keyword">void</span></span> <span <span class="hljs-keyword">class</span>=<span class="hljs-string">"hljs-title"</span>>onNext</span><span <span class="hljs-keyword">class</span>=<span class="hljs-string">"hljs-params"</span>>(MovieEntity movieEntity)</span> </span>{
                resultTV.setText(movieEntity.toString());
            }
        });

}
這就基本上完成了Retrofit和RxJava的結(jié)合莉兰,但是可以把創(chuàng)建Retrofit的過程封裝一下。可參考這篇文章,不錯(cuò)的一個(gè)例子

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末礁竞,一起剝皮案震驚了整個(gè)濱河市糖荒,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌苏章,老刑警劉巖寂嘉,帶你破解...
    沈念sama閱讀 222,590評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件奏瞬,死亡現(xiàn)場離奇詭異,居然都是意外死亡泉孩,警方通過查閱死者的電腦和手機(jī)硼端,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來寓搬,“玉大人珍昨,你說我怎么就攤上這事【渑纾” “怎么了镣典?”我有些...
    開封第一講書人閱讀 169,301評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長唾琼。 經(jīng)常有香客問我兄春,道長,這世上最難降的妖魔是什么锡溯? 我笑而不...
    開封第一講書人閱讀 60,078評論 1 300
  • 正文 為了忘掉前任赶舆,我火速辦了婚禮,結(jié)果婚禮上祭饭,老公的妹妹穿的比我還像新娘芜茵。我一直安慰自己,他們只是感情好倡蝙,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,082評論 6 398
  • 文/花漫 我一把揭開白布九串。 她就那樣靜靜地躺著,像睡著了一般寺鸥。 火紅的嫁衣襯著肌膚如雪猪钮。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,682評論 1 312
  • 那天析既,我揣著相機(jī)與錄音躬贡,去河邊找鬼。 笑死眼坏,一個(gè)胖子當(dāng)著我的面吹牛拂玻,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播宰译,決...
    沈念sama閱讀 41,155評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼檐蚜,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了沿侈?” 一聲冷哼從身側(cè)響起闯第,我...
    開封第一講書人閱讀 40,098評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎缀拭,沒想到半個(gè)月后咳短,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體填帽,經(jīng)...
    沈念sama閱讀 46,638評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,701評論 3 342
  • 正文 我和宋清朗相戀三年咙好,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了篡腌。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,852評論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡勾效,死狀恐怖嘹悼,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情层宫,我是刑警寧澤杨伙,帶...
    沈念sama閱讀 36,520評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站萌腿,受9級特大地震影響限匣,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜毁菱,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,181評論 3 335
  • 文/蒙蒙 一膛腐、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧鼎俘,春花似錦、人聲如沸辩涝。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,674評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽怔揩。三九已至捉邢,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間商膊,已是汗流浹背伏伐。 一陣腳步聲響...
    開封第一講書人閱讀 33,788評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留晕拆,地道東北人藐翎。 一個(gè)月前我還...
    沈念sama閱讀 49,279評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像实幕,于是被迫代替她去往敵國和親吝镣。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,851評論 2 361

推薦閱讀更多精彩內(nèi)容