原文鏈接:https://futurestud.io/blog/retrofit-token-authentication-on-android
本文是Retrofit系列文章的第三篇。本節介紹了 Retrofit 如何集成基于令牌驗證的API到你的Android項目。下面的列表顯示了該系列的所有文章:
Retrofit 系列目錄
- 開始創建android客戶端[已翻譯]
- Android上的基本認證[已翻譯]
- Android上的令牌認證
- Android上的OAuth
- 多個 Query 參數使用同一名字[已翻譯]
- 同步與異步請求[已翻譯]
- 在請求體里發送對象[已翻譯]
- 自定義一個響應轉換器[已翻譯]
- 添加自定義請求頭
- 可選的 Query 參數
- 如何集成 XML 轉換器
- 使用 Log Level 調試請求
- 如何上傳文件
- Series Round-Up
- Retrofit 2 — 1.9 升級指南
- Retrofit 2 — 如何上傳文件
- Retrofit 2 — Log 請求與響應
- Retrofit 2 — Android 上的 Hawk 認證
- Retrofit 2 — 簡單錯誤處理
- 如何在 Retrofit 1 里使用 OkHttp 3
- Retrofit 2 — 圖書更新發布慶典
- 提交表單數據 — Urlencoded
- 提交表單數據 — Urlencoded 使用FieldMap
- Retrofit 2 — 在 OkHttp 攔截器里管理請求頭部
- Retrofit 2 — 如何給每一個請求添加 Query 參數
- Retrofit 2 — 使用QueryMap 添加多個 Query 參數
- Retrofit 2 — 如何在請求時使用動態 Url
- Retrofit 2 — Url 處理,分辨和解析
- Retrofit 2 — POST 和PUT 請求里的常量, 默認值和邏輯值
- Retrofit 2 — 如何下載文件
- Retrofit 2 — 取消請求
- Retrofit 2 — 重用分析請求
- Retrofit 2 — 如何在運行時修改 API Base Url
- 可選Path參數
- 如何刷新 Access Token
- Retrofit 2 — 如何提交文本請求體
- Retrofit 2 — 使用 Query 參數來分頁
- Retrofit 2 — 使用 鏈接頭和動態 Url 來分頁(比如GitHub)
- Retrofit 2 — 使用范圍頭字段來分頁 (比如 Heroku)
- Retrofit 2 — 轉換器介紹
- Retrofit 2 — 添加并自定義 Gson 轉換器
- Retrofit 2 — 實現自定義轉換器
- Retrofit 2 — 只在開發環境里啟用日志
- Retrofit 2 — 如何上傳多個文件
- Retrofit 2 — Passing Multiple Parts Along a File with @PartMap
- Retrofit 2 — 模仿服務端響應基本概念
- Retrofit 2 — 模仿服務端響應自定義網絡行為
- Retrofit 2 — 使用 @HeaderMap 定義動態請求頭
本篇在上一篇 Android上的基本認證 的基礎上使用了 Retrofit 的 OAuth APIs(不是下一篇才會講嗎? 譯者注). 我們將涵蓋本話題.
集成令牌認證
如果你閱讀了上一篇關于Retrofit 認證的文章, 那么你應該猜出我們將做什么: 擴展 ServiceGenerator
類 — 集成一個處理令牌認證的方法. 那就讓我們開始擴展 ServiceGenerator
類的第二個 createService
方法吧(原來的第二個方法呢? 感覺這里沒表達清楚, 譯者注):
Retrofit 1.9
public class ServiceGenerator {
public static final String API_BASE_URL = "https://your.api-base.url";
private static RestAdapter.Builder builder = new RestAdapter.Builder()
.setEndpoint(API_BASE_URL)
.setClient(new OkClient(new OkHttpClient()));
public static <S> S createService(Class<S> serviceClass) {
return createService(serviceClass, null);
}
public static <S> S createService(Class<S> serviceClass, final String authToken) {
if (authToken != null) {
builder.setRequestInterceptor(new RequestInterceptor() {
@Override
public void intercept(RequestFacade request) {
request.addHeader("Authorization", authToken);
}
});
}
RestAdapter adapter = builder.build();
return adapter.create(serviceClass);
}
}
Retrofit 2
public class ServiceGenerator {
public static final String API_BASE_URL = "https://your.api-base.url";
private static OkHttpClient.Builder httpClient = new OkHttpClient.Builder();
private static Retrofit.Builder builder =
new Retrofit.Builder()
.baseUrl(API_BASE_URL)
.addConverterFactory(GsonConverterFactory.create());
public static <S> S createService(Class<S> serviceClass) {
return createService(serviceClass, null);
}
public static <S> S createService(Class<S> serviceClass, final String authToken) {
if (authToken != null) {
httpClient.addInterceptor(new Interceptor() {
@Override
public Response intercept(Interceptor.Chain chain) throws IOException {
Request original = chain.request();
// Request customization: add request headers
Request.Builder requestBuilder = original.newBuilder()
.header("Authorization", authToken)
.method(original.method(), original.body());
Request request = requestBuilder.build();
return chain.proceed(request);
}
});
}
OkHttpClient client = httpClient.build();
Retrofit retrofit = builder.client(client).build();
return retrofit.create(serviceClass);
}
}
正如你見到的, 我們將認證令牌做為String
變量傳進方法, 使用RequestInterceptor
( Retrofit 2 中是Interceptor
) 來設置 HTTP Authorization 頭部域. 如果你是用的是另一個 HTTP 頭部域來存儲認證令牌, 或者調整上述代碼或者創建一個新方法來處理需要的功能.
就是這樣 :)
從現在開始, 每一個用此方法創建的 HTTP 客戶端都在Authorization頭部域集成了令牌并且自動將令牌傳送到你的請求的 API 端點.
用法示例
讓我們創建一個示例并寫一點代碼. 下列的UserService
接口聲明了一個me()方法. 這個例子方法返回API響應創建的user對象.
Retrofit 1.9
public interface UserService {
@POST("/me")
User me();
}
Retrofit 2
public interface UserService {
@POST("/me")
Call<User> me();
}
假設你將要調用的API 在端點http://your.api-base.url/me等待所有請求并需要認證來獲取響應的用戶數據. 現在, 讓我們創建一個
UserService`接口來做實際的請求.
Retrofit 1.9
UserService userService =
ServiceGenerator.create(UserService.class, "auth-token");
User user = userService.me();
Retrofit 2
UserService userService =
ServiceGenerator.create(UserService.class, "auth-token");
Call<User> call = userService.me();
User user = call.execute().body();
這個代碼只是說明如何使用現成的類. 當然, 你必須傳送你的實際的認證令牌給ServiceGenerator
方法.
祝您使用 Retrofit 的API 認證 編程愉快. 如果你遇到了任何問題, 請聯系我們 @futurestud_io.
本篇結束, 感覺比上一篇還簡單啊 :) 譯者注