Android-Retrofit-GET-POST

0. Thanks To

Retrofit使用詳解(一)
Android Retrofit 2.0 的詳細 使用攻略(含實例講解)
Android Retrofit網(wǎng)絡(luò)請求Service,@Path、@Query羹铅、@QueryMap、@Map...

1.目錄

  • 簡介
  • 依賴
  • GET
  • POST

2.簡介

可以說壤蚜,Retrofit是當(dāng)下最快,效率最高的Http請求框架,他有如下的特點:

  • Retrofit 是一個 RESTful 的 HTTP 網(wǎng)絡(luò)請求框架的封裝省艳。(RESTful??可以百度百度這里不作討論)

  • Retrofit 其實是一個高度封裝的框架亲茅,其底層用的是Okhttp

  • 其工作流程大致如下:

1.png
  • Retrofit 所做的回铛,緊緊是把我們的一些接口參數(shù),請求方法組裝克锣,然后交給Okhttp去執(zhí)行茵肃。

3.依賴

樓主寫這篇文章的時候:(2018年1月21日18:15:57),最新的版本如下:
因為解析數(shù)據(jù)是JSON袭祟,這里還添加了Gson簡析工廠

compile 'com.squareup.retrofit2:retrofit:2.3.0'
compile 'com.squareup.retrofit2:converter-gson:2.3.0'

4.GET

  • Retrofit 通過注解形式验残,去聲明參數(shù),和請求方法巾乳。我們先看看該怎么正確地根據(jù)API去聲明一個借口您没。

  • 假如API是:http://abc.cn:8080/Market/getAppList?pageIndex=0&pageSize=8,抽離服務(wù)器項目地址:http://abc.cn:8080/Market/后胆绊,有兩個參數(shù)氨鹏,那么你應(yīng)該這樣聲明接口:

public interface GetAppList {
    @GET("getAppList")
    Call<AppListBean> get(@Query("pageIndex") int pageIndex, @Query("pageSize") int pageSize);
}

使用的是@Query注解聲明參數(shù),@GET("getAppList")聲明的是相對地址压状。

  • 假如API是:http://abc.cn:8080/Market/{userId}/getAppList
    變化的是API中的一部分仆抵,如:
http://abc.cn:8080/Market/123/getAppList
http://abc.cn:8080/Market/246/getAppList
http://abc.cn:8080/Market/468/getAppList

同樣,抽離服務(wù)器項目地址:http://abc.cn:8080/Market/种冬,聲明接口:

public interface GetAppList {
    @GET("{userId}/getAppList")
    Call<AppListBean> get(@Path("userId") int userId);
}

使用@Path聲明替換API的Path路徑镣丑。

  • 有了接口,就可以請求數(shù)據(jù):
//拼裝接口
Retrofit retrofit = new Retrofit.Builder()
        //設(shè)置網(wǎng)絡(luò)請求的 Base Url地址
        .baseUrl("http://abc.cn:8080/Market/")
        //設(shè)置數(shù)據(jù)解析器
        .addConverterFactory(GsonConverterFactory.create())
        .build();
// 創(chuàng)建 網(wǎng)絡(luò)請求接口 的實例
GetAppList request = retrofit.create(GetAppList.class);
//創(chuàng)建請求娱两,傳入?yún)?shù)
Call<AppListBean> call = request.get(1,8);
//異步請求
call.enqueue(new Callback<AppListBean>() {
    @Override
    public void onResponse(Call<AppListBean> call, Response<AppListBean> response) {

    }
    @Override
    public void onFailure(Call<AppListBean> call, Throwable t) {
    }
});

抽離的服務(wù)器項目地址http://abc.cn:8080/Market/應(yīng)該在創(chuàng)建請求的的時候通過Retrofit.Builder().baseUrl傳入莺匠。注意的是,baseUrl必須以/結(jié)尾十兢,不然拋異常趣竣。

  • 上面返回的JSON摇庙,Mapping后的Bean是AppListBean,直接使用插件生成即可期贫。

  • Call<T>是具體的請求實例跟匆,泛型是請求回來的數(shù)據(jù)Bean。

    2.png

  • enqueue通砍,執(zhí)行請求玛臂,有異步的和同步的。

  • cancel封孙,取消執(zhí)行迹冤。

  • clone,深復(fù)制虎忌。

  • Response<T>是結(jié)果體

    3.jpg

  • message泡徙,請求返回的結(jié)果信息。

  • isSuccessful膜蠢,是否成功堪藐。

  • code,請求的結(jié)果碼挑围,200是成功礁竞。

  • body,就是泛型T的實體杉辙,注意判空模捂。

再列舉其他的情況:

  • newsId參數(shù)一個,type參數(shù)個數(shù)不確定
http://api.stay4it.com/News?newsId=1&type=類型1…
http://api.stay4it.com/News?newsId={資訊id}&type={類型1}&type={類型2}…

這樣:

@GET("News")
Call<NewsBean> getItem(@QueryMap Map<String, String> map);

或者:

@GET("News")
Call<NewsBean> getItem(
             @Query("newsId") String newsId蜘矢,
             @QueryMap Map<String, String> map);

5.POST

上面敘述了GET和其他一些基礎(chǔ)的東西狂男。POST就來更直接的。

  • POST 一個字段
@POST("mobile/register")
Call<ResponseBody> registerDevice(@Field("id") String registerid);

@Field聲明字段的key

  • POST 兩個及兩個以上的字段
http://xxx/api/Comments
@FormUrlEncoded
@POST("Comments/{newsId}")
Call<Comment> reportComment(
        @Path("newsId") String commentId,
        @Field("reason") String reason);

@FormUrlEncoded表示請求發(fā)送編碼表單數(shù)據(jù)品腹,每個鍵值對需要使用@Field注解

  • POST URL不完整岖食,需要補全,使用@Path
http://xxx/api/Comments/1?access_token=1234123
http://xxx/api/Comments/{newsId}?access_token={access_token}
@FormUrlEncoded
@POST("Comments/{newsId}")
Call<Comment> reportComment(
        @Path("newsId") String commentId,
        @Query("access_token") String access_token,
        @Field("reason") String reason);

這個API還需要拼接一個newsId及一個Token舞吭,分別使用@Path@Query聲明

  • POST 對象(JSON)
 @POST("mobile/register")
    Call register1(@Body RegisterPost post);

@Body聲明對象县耽,Retrofit會自動序列化成JSON,序列化使用的庫镣典,通過:
.addConverterFactory(GsonConverterFactory.create())聲明。

  • POST 文件(圖片唾琼,MP3兄春,等等)
public interface FileUploadService {
 @Multipart
 @POST("upload")
 Call<ResponseBody> upload(@Part("description") RequestBody description,
                          @Part MultipartBody.Part file);
}

而他的請求寫法也有點不一樣:

// 創(chuàng)建 RequestBody,用于封裝構(gòu)建RequestBody
RequestBody requestFile = RequestBody.create(MediaType.parse("multipart/form-data"), file);
// MultipartBody.Part  和后端約定好Key锡溯,這里的partName是用image
MultipartBody.Part body = MultipartBody.Part.createFormData("image", file.getName(), requestFile);
// 添加描述
String descriptionString = "hello, 這是文件描述";
RequestBody description = RequestBody.create(MediaType.parse("multipart/form-data"), descriptionString);
// 執(zhí)行請求
Call<ResponseBody> call = service.upload(description, body);
call.enqueue(new Callback<ResponseBody>() {
    @Override
    public void onResponse(Call<ResponseBody> call,
                           Response<ResponseBody> response) {
        Log.v("Upload", "success");
    }

    @Override
    public void onFailure(Call<ResponseBody> call, Throwable t) {
        Log.e("Upload error:", t.getMessage());
      }
    });
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末赶舆,一起剝皮案震驚了整個濱河市哑姚,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌芜茵,老刑警劉巖叙量,帶你破解...
    沈念sama閱讀 222,252評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異九串,居然都是意外死亡绞佩,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評論 3 399
  • 文/潘曉璐 我一進店門猪钮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來品山,“玉大人,你說我怎么就攤上這事烤低≈饨唬” “怎么了?”我有些...
    開封第一講書人閱讀 168,814評論 0 361
  • 文/不壞的土叔 我叫張陵扑馁,是天一觀的道長涯呻。 經(jīng)常有香客問我,道長腻要,這世上最難降的妖魔是什么复罐? 我笑而不...
    開封第一講書人閱讀 59,869評論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮闯第,結(jié)果婚禮上市栗,老公的妹妹穿的比我還像新娘。我一直安慰自己咳短,他們只是感情好填帽,可當(dāng)我...
    茶點故事閱讀 68,888評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著咙好,像睡著了一般篡腌。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上勾效,一...
    開封第一講書人閱讀 52,475評論 1 312
  • 那天嘹悼,我揣著相機與錄音,去河邊找鬼层宫。 笑死杨伙,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的萌腿。 我是一名探鬼主播限匣,決...
    沈念sama閱讀 41,010評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼毁菱!你這毒婦竟也來了米死?” 一聲冷哼從身側(cè)響起锌历,我...
    開封第一講書人閱讀 39,924評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎峦筒,沒想到半個月后究西,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,469評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡物喷,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,552評論 3 342
  • 正文 我和宋清朗相戀三年卤材,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片脯丝。...
    茶點故事閱讀 40,680評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡商膊,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出宠进,到底是詐尸還是另有隱情晕拆,我是刑警寧澤,帶...
    沈念sama閱讀 36,362評論 5 351
  • 正文 年R本政府宣布材蹬,位于F島的核電站实幕,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏堤器。R本人自食惡果不足惜昆庇,卻給世界環(huán)境...
    茶點故事閱讀 42,037評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望闸溃。 院中可真熱鬧整吆,春花似錦、人聲如沸辉川。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽乓旗。三九已至府蛇,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間屿愚,已是汗流浹背汇跨。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留妆距,地道東北人穷遂。 一個月前我還...
    沈念sama閱讀 49,099評論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像娱据,于是被迫代替她去往敵國和親蚪黑。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,691評論 2 361

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)祠锣,斷路器,智...
    卡卡羅2017閱讀 134,711評論 18 139
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,310評論 25 707
  • 整體Retrofit內(nèi)容如下: 1咽安、Retrofit解析1之前哨站——理解RESTful2伴网、Retrofit解析2...
    隔壁老李頭閱讀 15,091評論 4 39
  • 世上的事 有人左右逢源 有人左右為難 世上的人 有人七彩玲瓏心 有人無竅榆木腦 風(fēng)生水起 驚天動地 柴米油鹽 ...
    左左_2c02閱讀 225評論 1 1
  • 1.現(xiàn)在天冷了,有男朋友的抱男朋友妆棒,有女朋友的抱女朋友澡腾,我就比較牛逼了,我不冷糕珊。动分。。
    劍來一聲三萬柄閱讀 143評論 1 1