[Android/Retrofit/外文翻譯]Retrofit系列教程-基礎(chǔ)API聲明

原文鏈接 : https://futurestud.io/tutorials/retrofit-2-basics-of-api-description

在上一篇教程 開始使用Rirtofit 中,我們已經(jīng)對一個 Git 端點實現(xiàn)了第一個請求。希望你正對使用 Retrofit 的更多功能感到躍躍欲試,在本篇教程中,你將學(xué)習(xí)到關(guān)于 Retrofit 如何描述 API 端點的更多細(xì)節(jié)。

如何描述API端點

正如我們上一個教程所學(xué)到的,我們在一個接口類中描述所有的Retrofit請求。我們的第一個例子向我們展示了Retrofit的多個功能。

public interface GitHubClient {  
    @GET("/users/{user}/repos")
    Call<List<GitHubRepo>> reposForUser(
        @Path("user") String user
    );
}

現(xiàn)在是時候讓我們進(jìn)一步了解這些功能的細(xì)節(jié)。

HTTP方法

我們已經(jīng)知道 Retrofit 通過在 Java 接口方法上使用注釋來描述各個 API 端點,最后才描述如何去處理這些請求。我們需要做的第一件事就是定義 HTTP 請求方法,如 GET, POST,PUT, DELETE 等等。Retrofit 為每個主要的標(biāo)準(zhǔn)請求方法提供了注釋,我們只需簡單的為每個HTTP方法使用對應(yīng)的注釋: @GET,@POST, @PUT, @DELETE, @PATCH 或者 @HEAD

我們總是需要為程序使用的API指定請求方法。如果你對HTTP請求方法還不太了解,請參閱WIKI相關(guān)頁面。 一般情況下,你應(yīng)該可以從API文檔找到恰當(dāng)?shù)恼埱蠓椒ā?/p>

下面是使用了 @GET、@PUT 、 @DELETE 的幾個簡單例子 :

public interface FutureStudioClient {  
    @GET("/user/info")
    Call<UserInfo> getUserInfo();

    @PUT("/user/info")
    Call<UserInfo> updateUserInfo(
        @Body UserInfo userInfo
    );

    @DELETE("/user")
    Call<Void> deleteUser();
}

HTTP資源地址

另外,我們需要把端點的相對 URL 作為 String 參數(shù)添加到注釋中,例如:@GET("/user/info")。在大多數(shù)情況下,我們只需傳入相對 URL,而不傳入完整 URL(如 http://futurestud.io/api/user/info ),這么做的好處是,Retrofit 只需要請求一次基本 URL( http://futurestud.io )。如果你需要改變 API 的基本 URl,只需要在一個地方進(jìn)行修改。此外,這使得一些先進(jìn)的東西,比如動態(tài)基礎(chǔ) URL,使用起來更加方便。不過你依然可以指定一個完整 URL。如果你希望學(xué)習(xí)更多關(guān)于 URl 的處理以及 基礎(chǔ) URL 與 相對 URL 的組合方式,請隨時閱讀我們的 URL 的處理和分析 指南。
再次給出幾個簡單例子:

public interface FutureStudioClient {  
    @GET("/user/info")
    Call<UserInfo> getUserInfo();

    @PUT("/user/info")
    Call<UserInfo> updateUserInfo(
        @Body UserInfo userInfo
    );

    @DELETE("/user")
    Call<Void> deleteUser();

    // example for passing a full URL
    @GET("https://futurestud.io/tutorials/rss/")
    Call<FutureStudioRssFeed> getRssFeed();
}

方法名與返回值類型

現(xiàn)在你已經(jīng)知道了如何使用HTTP請求方法注釋了,然而我們還沒有談到實際的 Java 方法聲明,Call<UserInfo> getUserInfo();,這包含了三個部分:

  • 1 方法名
  • 2 返回值類型
  • 3 方法參數(shù)

我們從容易的一個開始:方法名。我們可以自由的定義方法名,Retrofit 不在意你如何定義方法名,且對功能沒有任何影響。不過,我們還是應(yīng)該定義一個有助于自己和其他開發(fā)者了解這是什么API請求的名稱。

另一方面,方法的返回值相當(dāng)關(guān)鍵。必須定義你預(yù)期從服務(wù)器獲得的數(shù)據(jù)類型。例如,當(dāng)你正在請求某些用戶信息時,你可能會像這樣指定: Call<UserInfo>。UserInfo 類包含了用于保存用戶數(shù)據(jù)的變量。Retrofit將會自動進(jìn)行映射,不需要進(jìn)行任何手動解析。如果您想要獲取原始響應(yīng),可以使用 ResponseBody 替換 UserInfo 這樣的自定義類。如果完全不關(guān)心服務(wù)的響應(yīng)數(shù)據(jù),你可以使用 Void。在這種情況下,必須將它包裝成一個 Retrofit 的 Call<> 類。

最后,你可以給方法傳遞參數(shù),這很大程度取決于 API 端點的需要。方法參數(shù)存在非常多的選擇,所以這里只給出其中幾個例子:
@Body : 發(fā)送Java對象作為請求體
@Url : 使用動態(tài) URL
@Field : 發(fā)送表單數(shù)據(jù)

再次給出幾個用例:

public interface FutureStudioClient {  
    @GET("/user/info")
    Call<UserInfo> getUserInfo();

    @PUT("/user/info")
    Call<Void> updateUserInfo(
        @Body UserInfo userInfo
    );

    @GET
    Call<ResponseBody> getUserProfilePhoto(
        @Url String profilePhotoUrl
    );
}

路徑參數(shù)

REST標(biāo)準(zhǔn)的API是建立于動態(tài)URL上的,你可以通過替換URL的某部分來獲取資源,例如獲取我們頁面的第三篇教程的URl可能為 http://futurestud.io/api/tutorials/3,末尾的 3 指定了你想要訪問哪一篇教程。Retrofit提供了一種可以方便地替換這些路徑參數(shù)的方式。在入門教程中我們已經(jīng)看到過一個簡單的例子:

public interface GitHubClient {  
    @GET("/users/{user}/repos")
    Call<List<GitHubRepo>> reposForUser(
        @Path("user") String user
    );
}

在這里{user}告訴 Retrofit 這個值是動態(tài)的,且該值將在請求開始時配置。如果你使用的URl包含了一個路徑參數(shù),那么你必須在方法中添加一個 @Path 參數(shù),@Path的值會與URL中的占位符匹配(在上面的例子中為 @Path("user") )。如果需要,你可以使用多個占位符,只要你能夠確保有合適的可供匹配的參數(shù)即可。你甚至可以使用可選路徑參數(shù)。

查詢參數(shù)

動態(tài)URl的另一大部分是查詢參數(shù)。如果你已經(jīng)使用過過濾器,你會在我們的頁面上看到 https://futurestud.io/tutorials?filter=video。其中 ?filter=video 就是進(jìn)一步描述所需查找資源的查詢參數(shù)。與路徑參數(shù)不同的是,你不需要將他們添加到URL注釋中。你可以非常方便地在方法中添加一個帶有 @Query() 和查詢參數(shù)名的參數(shù),然后描述參數(shù)的類型就可以了。Retrofit會自動把它附加到請求中。如果將 null 作為值傳入查詢參數(shù)中,Retrofit會忽略它。你還可以添加多個查詢參數(shù)

public interface FutureStudioClient {  
    @GET("/tutorials")
    Call<List<Tutorial>> getTutorials(
        @Query("page") Integer page
    );

    @GET("/tutorials")
    Call<List<Tutorial>> getTutorials(
            @Query("page") Integer page,
            @Query("order") String order,
            @Query("author") String author,
            @Query("published_at") Date date
    );
}    

在上面的例子中,你也可以刪除第一個 getTutorials() 方法,通過在第二個方法的后三個參數(shù)傳入 null 值的方式來實現(xiàn)和第一個方法一樣的效果。

接下來

現(xiàn)在你已經(jīng)學(xué)會了如何為接口添加新的API端點,調(diào)整URL地址,HTTP方法,返回值類型,路徑和查詢參數(shù)等,但是這僅僅是入門而已。
Retrofit 提供了非常多的選項來進(jìn)一步完善網(wǎng)絡(luò)數(shù)據(jù)請求。例如,我們還沒有聊到 Header 呢。要學(xué)習(xí)的還有很多,所以讓我們繼續(xù)更多的教程吧!
如果您有什么反饋或者問題,請在 Twitter 里 @futurestud_io。

Make it rock & enjoy coding!

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

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

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