原文鏈接:https://futurestud.io/blog/retrofit-token-authentication-on-android
本文是Retrofit系列文章的第三篇。本節(jié)介紹了 Retrofit 如何集成基于令牌驗(yàn)證的API到你的Android項(xiàng)目橱健。下面的列表顯示了該系列的所有文章:
Retrofit 系列目錄
- 開始創(chuàng)建android客戶端[已翻譯]
- Android上的基本認(rèn)證[已翻譯]
- Android上的令牌認(rèn)證
- Android上的OAuth
- 多個(gè) Query 參數(shù)使用同一名字[已翻譯]
- 同步與異步請(qǐng)求[已翻譯]
- 在請(qǐng)求體里發(fā)送對(duì)象[已翻譯]
- 自定義一個(gè)響應(yīng)轉(zhuǎn)換器[已翻譯]
- 添加自定義請(qǐng)求頭
- 可選的 Query 參數(shù)
- 如何集成 XML 轉(zhuǎn)換器
- 使用 Log Level 調(diào)試請(qǐng)求
- 如何上傳文件
- Series Round-Up
- Retrofit 2 — 1.9 升級(jí)指南
- Retrofit 2 — 如何上傳文件
- Retrofit 2 — Log 請(qǐng)求與響應(yīng)
- Retrofit 2 — Android 上的 Hawk 認(rèn)證
- Retrofit 2 — 簡(jiǎn)單錯(cuò)誤處理
- 如何在 Retrofit 1 里使用 OkHttp 3
- Retrofit 2 — 圖書更新發(fā)布慶典
- 提交表單數(shù)據(jù) — Urlencoded
- 提交表單數(shù)據(jù) — Urlencoded 使用FieldMap
- Retrofit 2 — 在 OkHttp 攔截器里管理請(qǐng)求頭部
- Retrofit 2 — 如何給每一個(gè)請(qǐng)求添加 Query 參數(shù)
- Retrofit 2 — 使用QueryMap 添加多個(gè) Query 參數(shù)
- Retrofit 2 — 如何在請(qǐng)求時(shí)使用動(dòng)態(tài) Url
- Retrofit 2 — Url 處理,分辨和解析
- Retrofit 2 — POST 和PUT 請(qǐng)求里的常量, 默認(rèn)值和邏輯值
- Retrofit 2 — 如何下載文件
- Retrofit 2 — 取消請(qǐng)求
- Retrofit 2 — 重用分析請(qǐng)求
- Retrofit 2 — 如何在運(yùn)行時(shí)修改 API Base Url
- 可選Path參數(shù)
- 如何刷新 Access Token
- Retrofit 2 — 如何提交文本請(qǐng)求體
- Retrofit 2 — 使用 Query 參數(shù)來(lái)分頁(yè)
- Retrofit 2 — 使用 鏈接頭和動(dòng)態(tài) Url 來(lái)分頁(yè)(比如GitHub)
- Retrofit 2 — 使用范圍頭字段來(lái)分頁(yè) (比如 Heroku)
- Retrofit 2 — 轉(zhuǎn)換器介紹
- Retrofit 2 — 添加并自定義 Gson 轉(zhuǎn)換器
- Retrofit 2 — 實(shí)現(xiàn)自定義轉(zhuǎn)換器
- Retrofit 2 — 只在開發(fā)環(huán)境里啟用日志
- Retrofit 2 — 如何上傳多個(gè)文件
- Retrofit 2 — Passing Multiple Parts Along a File with @PartMap
- Retrofit 2 — 模仿服務(wù)端響應(yīng)基本概念
- Retrofit 2 — 模仿服務(wù)端響應(yīng)自定義網(wǎng)絡(luò)行為
- Retrofit 2 — 使用 @HeaderMap 定義動(dòng)態(tài)請(qǐng)求頭
本篇在上一篇 Android上的基本認(rèn)證 的基礎(chǔ)上使用了 Retrofit 的 OAuth APIs(不是下一篇才會(huì)講嗎? 譯者注). 我們將涵蓋本話題.
集成令牌認(rèn)證
如果你閱讀了上一篇關(guān)于Retrofit 認(rèn)證的文章, 那么你應(yīng)該猜出我們將做什么: 擴(kuò)展 ServiceGenerator
類 — 集成一個(gè)處理令牌認(rèn)證的方法. 那就讓我們開始擴(kuò)展 ServiceGenerator
類的第二個(gè) createService
方法吧(原來(lái)的第二個(gè)方法呢? 感覺這里沒表達(dá)清楚, 譯者注):
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);
}
}
正如你見到的, 我們將認(rèn)證令牌做為String
變量傳進(jìn)方法, 使用RequestInterceptor
( Retrofit 2 中是Interceptor
) 來(lái)設(shè)置 HTTP Authorization 頭部域. 如果你是用的是另一個(gè) HTTP 頭部域來(lái)存儲(chǔ)認(rèn)證令牌, 或者調(diào)整上述代碼或者創(chuàng)建一個(gè)新方法來(lái)處理需要的功能.
就是這樣 :)
從現(xiàn)在開始, 每一個(gè)用此方法創(chuàng)建的 HTTP 客戶端都在Authorization頭部域集成了令牌并且自動(dòng)將令牌傳送到你的請(qǐng)求的 API 端點(diǎn).
用法示例
讓我們創(chuàng)建一個(gè)示例并寫一點(diǎn)代碼. 下列的UserService
接口聲明了一個(gè)me()方法. 這個(gè)例子方法返回API響應(yīng)創(chuàng)建的user對(duì)象.
Retrofit 1.9
public interface UserService {
@POST("/me")
User me();
}
Retrofit 2
public interface UserService {
@POST("/me")
Call<User> me();
}
假設(shè)你將要調(diào)用的API 在端點(diǎn)http://your.api-base.url/me等待所有請(qǐng)求并需要認(rèn)證來(lái)獲取響應(yīng)的用戶數(shù)據(jù). 現(xiàn)在, 讓我們創(chuàng)建一個(gè)
UserService`接口來(lái)做實(shí)際的請(qǐng)求.
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();
這個(gè)代碼只是說(shuō)明如何使用現(xiàn)成的類. 當(dāng)然, 你必須傳送你的實(shí)際的認(rèn)證令牌給ServiceGenerator
方法.
祝您使用 Retrofit 的API 認(rèn)證 編程愉快. 如果你遇到了任何問(wèn)題, 請(qǐng)聯(lián)系我們 @futurestud_io.
本篇結(jié)束, 感覺比上一篇還簡(jiǎn)單啊 :) 譯者注