写在前面: 本文是我看到Retrofit官方推荐的一个Retrofit技术文档,感觉收益匪浅,特此想把文档翻译一下,大家一起学习。
原文地址:https://futurestud.io/tutorials/retrofit-getting-started-and-android-client
本篇博文描述了如何在不使用您的Android app的API的情况下验证Token。
我们将会涉及从Android app到web service 或者支持这种验证的Api的所有token验证的话题。
集成Token验证
如果你阅读了前一篇文章,你会猜想我们将会做什么:扩展ServiceGenerator的功能,增加方法使他能够处理token验证。
OK,让我们开始拓展ServiceGenerator的第二个createService方法实现吧。
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);
}
}
如你所见,我们将认证token作为String变量传入方法,使用RequestInterceptor来设置HTTP头部区域认证。
如果你想是同其他的http头部区域的话,要么调整上述的代码,要么创建新的方法来实现这个功能。
现在,每一个通过Authorization头部区域的token值生成的HTTP client都会在发送请求时自动向你的api端口传递token值。
举个栗子
通过一个栗子来学习一下。这个uerservice接口声明了一个me()的方法。这个方法会放回API响应创建的用户对象。
Retrofit 2
public interface UserService {
@POST("/me")
Call<User> me();
}
当你在等待在端口http://your.api-base.url/me的任何请求时,你可以调用这个api,并且请求在回复中的用户信息。现在,让我们创建一个用户服务对象,并进行实际的请求。
Retrofit 2
UserService userService =
ServiceGenerator.create(UserService.class, "auth-token");
Call<User> call = userService.me();
User user = call.execute().body();
这个代码表明了如何使用现有的类。当然你必须向你的ServiceGenerator方法发送token值。