Retrofit

有道翻譯的Retrofit官方文檔需要翻墻才能看~

一:定義:

用于Android和Java的類(lèi)型安全HTTP客戶(hù)機(jī)

二:介紹

1.改進(jìn)將您的HTTP API轉(zhuǎn)換為Java接口。

public interface GitHubService{

? ? @GET("users/{user}/repos")

? ?Call<List<Pro> listRepos(@Path("user") String user);

}

2.Retrofit類(lèi)生成一個(gè)GitHubService接口的實(shí)現(xiàn)。

Retrofit retrofit=new Retrofit.Builder()

? ? ?.baseUrl("https://api.github.com/")

? ? ?.build();

GitHubService service=retrofit.create(GitHubService.class);

3.來(lái)自創(chuàng)建的GitHubService的每個(gè)調(diào)用都可以向遠(yuǎn)程web服務(wù)器發(fā)出同步或異步的HTTP請(qǐng)求。

Call<List<Pero>> repos=service.listRepos("octocat");

4.使用注釋來(lái)描述HTTP請(qǐng)求:

URL參數(shù)替換和查詢(xún)參數(shù)支持

對(duì)象轉(zhuǎn)換為請(qǐng)求主體(例如、JSON、協(xié)議緩沖區(qū))

多部件請(qǐng)求體和文件上傳

三:API聲明:

接口方法及其參數(shù)上的注釋指示如何處理請(qǐng)求。

1.請(qǐng)求方法:

每個(gè)方法都必須有一個(gè)提供請(qǐng)求方法和相對(duì)URL的HTTP注釋。有5個(gè)內(nèi)置注釋:GET、POST、PUT、DELETE和HEAD。該資源的相對(duì)URL是在注釋中指定的。

@GET("users/list")

您還可以在URL中指定查詢(xún)參數(shù)。

@GET("users/list?sort=desc")

2.URL操作:

可以使用該方法的替換塊和參數(shù)動(dòng)態(tài)地更新請(qǐng)求URL。替換塊是由字母和數(shù)字包圍的字母數(shù)字字符串。一個(gè)相應(yīng)的參數(shù)必須使用相同的字符串對(duì)@path進(jìn)行注釋。

@GET("group/{id}/users")

Call<List<User> ? groupList(@Path("id") int groupId);

還可以添加查詢(xún)參數(shù)。

@GET("group/{id}/users")

Call<List<User>> groupList(@Path("id") int groupId, @Query("sort") String sort);

對(duì)于復(fù)雜的查詢(xún)參數(shù)組合,可以使用映射。

@GET("group/{id}/users")

Call<List<User>> groupList(@Path("id") int groupId, @QueryMap Map<String,String> options);

3.請(qǐng)求體

可以指定一個(gè)對(duì)象作為一個(gè)帶有@body注釋的HTTP請(qǐng)求體。

@POST("users/new")

Call<User>?createUser(@Body User user);

該對(duì)象還將使用Retrofit實(shí)例中指定的轉(zhuǎn)換器進(jìn)行轉(zhuǎn)換。如果不添加任何轉(zhuǎn)換器,則只能使用RequestBody。

4.表單編碼和多部分

方法也可以被聲明為發(fā)送表單編碼和多部分?jǐn)?shù)據(jù)。

表單編碼的數(shù)據(jù)是在該方法上出現(xiàn)@formurlen編碼時(shí)發(fā)送的。每個(gè)鍵值對(duì)都帶有@field的注釋?zhuān)渲邪Q(chēng)和提供該值的對(duì)象。

@FormUrlEncoded

@POST("user/edit")

Call<User>?updateUser(@Field("first_name")String first,@Field("last_name")String last);

當(dāng)@multi部件出現(xiàn)在該方法時(shí),將使用多部件請(qǐng)求。部分是使用@part注釋聲明的。

@Multipart

@PUT("user/photo")

Call<User>?updateUser(@Part("photo") RequestBody photo,@Part("description") RequestBody description);

多部件部件使用一個(gè)Retrofit轉(zhuǎn)換器,或者他們可以實(shí)現(xiàn)請(qǐng)求體來(lái)處理他們自己的序列化。

5.頭操作

您可以使用@header注釋為方法設(shè)置靜態(tài)標(biāo)題。

@Headers("Cache-Control: max-age=640000")

@GET("widget/list")

Call<List<Widget> widgetList();

@Headers({

? ? ? "Accept: application/vnd.github.v3.full+json",

? ? ? "User-Agent: Retrofit-Sample-App"

})

@GET("users/{username}")

Call<User>?getUser(@Path("username")String username);

注意,頭文件不會(huì)互相覆蓋。所有包含相同名字的標(biāo)題都將包含在請(qǐng)求中。

可以使用@Header注釋動(dòng)態(tài)地更新請(qǐng)求頭。必須將相應(yīng)的參數(shù)提供給@header。如果值為null,則將省略頭。否則,toString將調(diào)用該值,并使用該結(jié)果。

@GET("user")

Call<User>?getUser(@Header("Authorization")String authorization)

需要添加到每個(gè)請(qǐng)求的頭信息都可以使用OkHttp攔截器來(lái)指定。

6.同步或異步

調(diào)用實(shí)例可以同步或異步執(zhí)行。每個(gè)實(shí)例只能使用一次,但是調(diào)用克隆()將創(chuàng)建一個(gè)可以使用的新實(shí)例。

在Android上,回調(diào)將在主線(xiàn)程上執(zhí)行。在JVM上,回調(diào)將發(fā)生在執(zhí)行HTTP請(qǐng)求的同一線(xiàn)程上。

四:要改裝配置

Retrofit是將您的API接口轉(zhuǎn)化為可調(diào)用對(duì)象的類(lèi)。默認(rèn)情況下,Retrofit會(huì)為你的平臺(tái)提供合理的默認(rèn)值,但它允許定制。

1.轉(zhuǎn)換器

默認(rèn)情況下,Retrofit只能將HTTP主體反序列化為OkHttp的ResponseBody類(lèi)型,并且只能接受它的請(qǐng)求體類(lèi)型為@body。

可以添加轉(zhuǎn)換器來(lái)支持其他類(lèi)型。為了方便,6個(gè)兄弟模塊調(diào)整了流行的序列化庫(kù)。

Gson:com.squareup.retrofit2:converter-gson

Jackson:com.squareup.retrofit2:converter-jackson

Moshi:com.squareup.retrofit2:converter-moshi

Protobuf:com.squareup.retrofit2:converter-protobuf

Wire:com.squareup.retrofit2:converter-wire

Simple XML:com.squareup.retrofit2:converter-simplexml

Scalars (primitives, boxed, and String):com.squareup.retrofit2:converter-scalars


這里有一個(gè)使用GsonConverterFactory類(lèi)來(lái)生成GitHubService接口的示例,該接口使用Gson進(jìn)行反序列化。

Retrofitretrofit=newRetrofit.Builder()

? ? .baseUrl("https://api.github.com")

? ?.addConverterFactory(GsonConverterFactory.create()

? ? .build();

GitHubService service=retrofit.create(GitHubService.class);

2.自定義轉(zhuǎn)換器

如果您需要使用一個(gè)API,該API使用的內(nèi)容格式并不支持box(例如YAML、txt、定制格式),或者您希望使用不同的庫(kù)來(lái)實(shí)現(xiàn)現(xiàn)有的格式,那么您可以輕松地創(chuàng)建自己的轉(zhuǎn)換器。創(chuàng)建一個(gè)擴(kuò)展轉(zhuǎn)換器的類(lèi)。工廠(chǎng)類(lèi),并在構(gòu)建適配器時(shí)傳入一個(gè)實(shí)例。

五:應(yīng)用?


以下為我項(xiàng)目中的應(yīng)用

Retrofit

compile'com.squareup.retrofit2:retrofit:2.2.0'

compile'com.squareup.retrofit2:converter-gson:2.2.0'

compile'com.squareup.retrofit2:adapter-rxjava:2.2.0'

compile'com.squareup.retrofit2:converter-scalars:2.2.0'

具體應(yīng)用查看:你真的會(huì)用Retrofit2嗎?Retrofit2完全教程

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 簡(jiǎn)介 剛接觸Retrofit的時(shí)候,就寫(xiě)了一篇簡(jiǎn)單的使用介紹:Retrofit 2.0基本使用方法,算是對(duì)Retr...
    Whyn閱讀 3,106評(píng)論 4 24
  • 寫(xiě)在前面## 其實(shí)一直都沒(méi)有寫(xiě)博客的習(xí)慣,借著這次公司內(nèi)部分享的機(jī)會(huì),開(kāi)始寫(xiě)博客,希望以后漸漸養(yǎng)成習(xí)慣。也方便以后...
    seph_von閱讀 958評(píng)論 0 1
  • Retrofit詳解 在目前的開(kāi)發(fā)環(huán)境下,相信Retrofit這個(gè)詞大家已經(jīng)非常熟悉了,就像之前volley剛出來(lái)...
    OpenCoder閱讀 5,910評(píng)論 0 10
  • 說(shuō)好每天要看書(shū)的,說(shuō)好一天寫(xiě)點(diǎn)東西的。自己確實(shí)對(duì)待別人的態(tài)度不太好,今天。無(wú)論怎樣,不要發(fā)脾氣,不要自尋煩惱??雌?..
    檸檬安然閱讀 281評(píng)論 0 0
  • 有些人光是遇見(jiàn) 就已經(jīng)很開(kāi)心了
    FAB小鐘鐘閱讀 146評(píng)論 0 0

友情鏈接更多精彩內(nèi)容