这是 Retrofit 系列文章的第二篇。将介绍了如何使用 Retrofit 完成用户名/邮箱和密码的身份验证。
在前面的章节里,我们已经创建了一个初始版本的 API/HTTP 请求客户端。我们会在此基础上增加基本的身份验证功能。
集成基本的身份验证
让我们更新下 ServiceGenerator 类,创建一个添加验证的方法。下面的代码片段是基于上面的类的。同时也为下面 1.9 版本的代码添加了 2.0 的示例。如果你依赖于 Retrofit 2.0 版本,可以直接跳过 1.9 的例子,直接看第二个代码块:)
Retrofit 1.9
1 | public class ServiceGenerator { |
Retrofit 2
1 | public class ServiceGenerator { |
新的方法有两个参数:用户名 和 密码。当然你也可以用邮箱来代替用户名。与在第一个方法中创建客户端的方法是一样的:使用 RestAdapter (Retrofit 2 中为 Retrofit)类设置基本的 url 和 OkHttpClient。
不同的是:我们使用一个请求拦截器 RequestInterceptor (Retrofit 2 中为 Interceptor )来设置基础 url Http 请求的头信息。如果提供了用户名和密码,会执行新的方法。如果用户名和密码不正确时,会创建第一个方法中的客户端。这是我们简化第一个方法的原因。
在验证部分我们必须调整用户名/邮箱和密码的格式。基础身份验证需要一个冒号连接两个值的字符串。此外,新创建的字符串必须经过 Base64 编码。
几乎任何一个 webservice 和 API 的验证都是在 HTTP 的请求头里面的。这是我们在请求头里面设置编码值的原因。
如果你想接收特殊格式的服务器响应时,Accent 头是很重要的。例如,我们想接收 JSON 格式的响应,因为 Retrofit 和 Google 的 GSON 配合会将 java 对象序列化为 JSON,反过来也可以。
用法
调用我们之前写的 ServiceGenerator 类的新方法。例如,下面代码定义的 LoginService。
Retrofit 1.9
1 | public interface LoginService { |
Retrofit 2
1 | public interface LoginService { |
上面的接口只包含一个 baseLogin 的方法。该方法返回 User 类型,没有任何的查询参数。
现在你可以通过给定的证书(用户名和密码)创建你的 HTTP 客户端了。
Retrofit 1.9
1 | LoginService loginService = ServiceGenerator |
Retrofit 2
1 | LoginService loginService = ServiceGenerator |
ServiceGenerator 的方法会创建一个包含验证信息的 HTTP 客户端。一旦你调用 loginService 的 basicLogin 方法,被提供的证书将会被自动传递到你定义的基础 url 了。
接下来是什么
下篇文章将介绍如何使用 Retrofit 实现 OAuth。
原文地址:https://futurestud.io/blog/android-basic-authentication-with-retrofit/