上一篇學(xué)習(xí)了okhttp的入門篇,這一篇學(xué)習(xí)的retrofit底層默認(rèn)使用的就是okhttp,相信大家多少也聽過(guò)這個(gè)框架澡谭,下面我們就來(lái)一起學(xué)習(xí)下,講真纺涤,學(xué)會(huì)之后這個(gè)框架用起來(lái)真的很爽译暂,特別靈活。
按照習(xí)慣先來(lái)說(shuō)一下它的優(yōu)缺點(diǎn)
優(yōu)點(diǎn):
可以配置不同HTTP client來(lái)實(shí)現(xiàn)網(wǎng)絡(luò)請(qǐng)求撩炊,如okhttp外永、httpclient等
請(qǐng)求的方法參數(shù)注解都可以定制
支持同步、異步和RxJava
超級(jí)解耦
可以配置不同的反序列化工具來(lái)解析數(shù)據(jù)拧咳,如json伯顶、xml等
使用非常方便靈活
框架使用了很多設(shè)計(jì)模式(感興趣的可以看看源碼學(xué)習(xí)學(xué)習(xí))
缺點(diǎn):
不能接觸序列化實(shí)體和響應(yīng)數(shù)據(jù)
執(zhí)行的機(jī)制太嚴(yán)格
使用轉(zhuǎn)換器比較低效
只能支持簡(jiǎn)單自定義參數(shù)類型
相關(guān)學(xué)習(xí)資料的網(wǎng)址
retrofit官網(wǎng):http://square.github.io/retrofit/
github地址:https://github.com/square/retrofit
Simple HTTP with Retrofit2:
https://realm.io/news/droidcon-jake-wharton-simple-http-retrofit-2/
環(huán)境配置
在builde.gradle里面添加上
compile'com.squareup.retrofit2:retrofit:2.1.0'compile'com.squareup.retrofit2:converter-gson:2.1.0'compile'com.squareup.okhttp3:okhttp:3.4.1'
在AndroidManifest.xml添加所需權(quán)限
基本使用
?get異步請(qǐng)求
.baseUrl設(shè)置最基本url,也就是http請(qǐng)求的url前綴,可以把項(xiàng)目中重復(fù)的前綴用這個(gè)來(lái)設(shè)置
.addConverterFactory(GsonConverterFactory.create())是添加Gson數(shù)據(jù)解析ConverterFactory,后面會(huì)專門介紹下這個(gè),這里就不做過(guò)多解釋
ResponseBody這個(gè)是okhttp里面的對(duì)象骆膝,可以直接返回整個(gè)字符串祭衩,也可以獲取流的形式
post異步請(qǐng)求
POST與GET實(shí)現(xiàn)基本上是一樣的,只是把注解GET換成POST就OK.為了測(cè)試POST阅签,專門去網(wǎng)上找了個(gè)接口測(cè)試掐暮,下面就分享給大家,既可以用GET也可以用POST請(qǐng)求
http://www.kuaidi100.com/query?type=快遞公司代號(hào)&postid=快遞單號(hào) ps:快遞公司編碼:申通="shentong"EMS="ems"順豐="shunfeng"圓通="yuantong"中通="zhongtong"韻達(dá)="yunda"天天="tiantian"匯通="huitongkuaidi"全峰="quanfengkuaidi"德邦="debangwuliu"宅急送="zhaijisong"
拿著這個(gè)接口來(lái)實(shí)現(xiàn)一下POST異步請(qǐng)求
http://www.bejson.com/knownjson/webInterface/這網(wǎng)站里面還有一些其它免費(fèi)接口,感興趣的可以去看看
常用注解的使用介紹
上面GitHubService里面的注解大家應(yīng)該都能猜它的作用了吧政钟,下面就給大家介紹下
@GET和@POST分別是get和post請(qǐng)求路克。括號(hào)里面的value值與上面.baseUrl組成完整的路徑
@Path動(dòng)態(tài)的URL訪問(wèn)。像上面get請(qǐng)求中的{user}可以把它當(dāng)做一個(gè)占位符养交,通過(guò)@Path("user")標(biāo)注的參數(shù)進(jìn)行替換
@Query請(qǐng)求參數(shù)精算。無(wú)論是GET或POST的參數(shù)都可以用它來(lái)實(shí)現(xiàn)
@QueryMap請(qǐng)求參數(shù)使用Map集合∷榱可以傳遞一個(gè)map集合對(duì)象
@Body實(shí)體請(qǐng)求參數(shù)灰羽。顧名思義可以傳遞一個(gè)實(shí)體對(duì)象來(lái)作為請(qǐng)求的參數(shù),不過(guò)實(shí)體屬性要與參數(shù)名一一致
@FormUrlEncoded和@Field簡(jiǎn)單的表單鍵值對(duì)鱼辙。兩個(gè)需要結(jié)合使用廉嚼,使用如下:
@FormUrlEncoded@POST("user/edit")Call updateUser(@Field("first_name") String first, @Field("last_name") String last);
@Multipart和@PartPOST表單的方式上傳文件可以攜帶參數(shù)。兩個(gè)需要結(jié)合使用倒戏,使用方式查看下面文件上傳中介紹前鹅。
@PartMap和@PartPOST表單上傳多個(gè)文件攜帶參數(shù)。兩個(gè)結(jié)合使用峭梳,使用方式查看下面文件上傳中介紹。
這里只介紹了一些常用的,大家如果想了解更多可以查看相關(guān)文檔
文件上傳
1葱椭、單文件上傳攜帶參數(shù)(使用注解@Multipart和@Part)捂寿,需要在手機(jī)SD卡目錄下的Pictures文件夾下添加xuezhiqian.png圖片
@Multipart@POST("UploadServlet")Call uploadfile(@Part MultipartBody.Part photo, @Part("username") RequestBody username, @Part("password") RequestBody password);
2、多文件上傳攜帶參數(shù)(使用注解@PartMap和@Part),需要再在手機(jī)SD卡目錄下的Pictures文件夾下添加xuezhiqian2.png圖片
@Multipart@POST("UploadServlet")Call uploadfile(@PartMap Map params,? @Part("password") RequestBody password);
文件下載
可以采用OKHTTP下載文件的方式孵运,利用ResponseBody對(duì)象秦陋,調(diào)用response.body().byteStream()方法獲取InputStream輸入流,通過(guò)寫文件操作來(lái)實(shí)現(xiàn)治笨。
同步請(qǐng)求和結(jié)合RxJava的使用
1驳概、同步請(qǐng)求
Call.execute()同步請(qǐng)求網(wǎng)絡(luò),要注意的是Android4.0以后不能在主線程里調(diào)用旷赖,要開一個(gè)異步線程來(lái)使用顺又,
Call.enqueue()異步請(qǐng)求網(wǎng)絡(luò),加入一個(gè)回調(diào)等孵,同步異步需要可按照不同的場(chǎng)景來(lái)使用稚照。
Call.cancel()取消此次請(qǐng)求,有一些場(chǎng)景還是會(huì)用到該方法的俯萌。
2果录、結(jié)合RxJava使用
@POST("query")Observable searchRx(@Query("type") String type, @Query("postid") String postid);
配置OKHttp
鏈接:http://www.reibang.com/p/a94e38636fde