2. Retrofit2 -- Basic Authentication on Android

android
Retrofit
tutorial

上一节课中,我们创建了用于执行 API/HTTP 请求的原始 Android 客户端版本。本节课中,我们将使用上节课的客户端,对它进行增强,给它添加基本的认证功能。

整合基本的认证


首先,更新 ServiceGenerator 类,添加方法,用于把认证添加到请求上。下面的代码使用 1.92.0 版本分别进行了扩展:

Retrofit 1.9

  1. public class ServiceGenerator { 


  2. public static final String API_BASE_URL = "https://your.api-base.url"; 


  3. private static RestAdapter.Builder builder = new RestAdapter.Builder() 

  4. .setEndpoint(API_BASE_URL) 

  5. .setClient(new OkClient(new OkHttpClient())); 


  6. public static <S> S createService(Class<S> serviceClass) { 

  7. return createService(serviceClass, null, null); 




  8. public static <S> S createService(Class<S> serviceClass, String username, String password) { 

  9. if (username != null && password != null) { 

  10. // concatenate username and password with colon for authentication 

  11. String credentials = username + ":" + password; 

  12. // create Base64 encodet string 

  13. final String basic = 

  14. "Basic " + Base64.encodeToString(credentials.getBytes(), Base64.NO_WRAP); 


  15. builder.setRequestInterceptor(new RequestInterceptor() { 

  16. @Override 

  17. public void intercept(RequestFacade request) { 

  18. request.addHeader("Authorization", basic); 

  19. request.addHeader("Accept", "application/json"); 



  20. }); 




  21. RestAdapter adapter = builder.build(); 

  22. return adapter.create(serviceClass); 





Retrofit 2.0

  1. public class ServiceGenerator { 


  2. public static final String API_BASE_URL = "https://your.api-base.url"; 


  3. private static OkHttpClient.Builder httpClient = new OkHttpClient.Builder(); 


  4. private static Retrofit.Builder builder = 

  5. new Retrofit.Builder() 

  6. .baseUrl(API_BASE_URL) 

  7. .addConverterFactory(GsonConverterFactory.create()); 


  8. public static <S> S createService(Class<S> serviceClass) { 

  9. return createService(serviceClass, null, null); 




  10. public static <S> S createService(Class<S> serviceClass, String username, String password) { 

  11. if (username != null && password != null) { 

  12. String credentials = username + ":" + password; 

  13. final String basic = 

  14. "Basic " + Base64.encodeToString(credentials.getBytes(), Base64.NO_WRAP); 


  15. httpClient.addInterceptor(new Interceptor() { 

  16. @Override 

  17. public Response intercept(Interceptor.Chain chain) throws IOException { 

  18. Request original = chain.request(); 


  19. Request.Builder requestBuilder = original.newBuilder() 

  20. .header("Authorization", basic) 

  21. .header("Accept", "application/json") 

  22. .method(original.method(), original.body()); 


  23. Request request = requestBuilder.build(); 

  24. return chain.proceed(request); 



  25. }); 




  26. OkHttpClient client = httpClient.build(); 

  27. Retrofit retrofit = builder.client(client).build(); 

  28. return retrofit.create(serviceClass); 





新方法中,多了两个参数:usernamepassword。创建客户端的基本方法与老方法一样:使用 RestAdapter2.0 版本是 Retrofit)类为所有的 HTTP 请求和响应处理创建 OKHttp 客户端。

新方法的不同在于:使用了 RequestInterceptor2.0 版本是 Inteceptor)类来为 OKHttp 客户端执行的 HTTP 请求设置认证的头部。当然,只有提供了 usernamepassword 参数,才会设置的。如果该方法没有接收到 usernamepassword 参数,那么它创建的客户端与第一个方法相同。

关于验证部分,我们必须调整 usernamepassword 的格式。基本认证请求把所有值当作一个以逗号分隔的多行索引字符串。此外,新创建的字符串必须是 Base64 格式的编码。

大多数的 webserviceAPI 都会对 HTTP 请求的认证头部进行计算。这就是为什么我们要把编码认证的值设置到头部。如果你调用 web 服务的客户端使用了其它的头部字段来接收用户的认证,那你应该把头部的 Authorization 转换为你服务所需的字段。

如果你想使用某种特定的格式来接收服务响应,那么,Accept 头部字段起着决定性的作用。在示例中,我们要求服务器返回的信息格式是 JSON。这是因为我们配置了 retrofit 使用 Google GSON 把序列化的对象和 JSON 互相转换。

用法


新方法的调用方法与上节课旧方法的调用方法一样。假定,我们定义了一个 LoginService

Retrofit 1.9

  1. public interface LoginService {  

  2. @POST("/login") 

  3. void basicLogin(Callback<User> cb); 



Retrofit 2.0

  1. public interface LoginService {  

  2. @POST("/login") 

  3. Call<User> basicLogin(); 



上面的接口只有一个方法:basicLogin。它的响应值类型是:User,没有其它的查询、或路径参数。

现在,我们创建一个客户端并把认证信息(username password)传入:

Retrofit 1.9

  1. LoginService loginService =  

  2. ServiceGenerator.createService(LoginService.class, "user", "secretpassword"); 

  3. loginService.basicLogin(new Callback<User>() {  

  4. @Override 

  5. public void success(User user, Response response) { 

  6. // user object available 




  7. @Override 

  8. public void failure(RetrofitError error) { 

  9. // handle errors, too 



  10. }); 

Retrofit 2.0

  1. LoginService loginService =  

  2. ServiceGenerator.createService(LoginService.class, "user", "secretpassword"); 

  3. Call<User> call = loginService.basicLogin();  

  4. call.enqueue(new Callback<User >() {  

  5. @Override 

  6. public void onResponse(Call<User> call, Response<User> response) { 

  7. if (response.isSuccessful()) { 

  8. // user object available 

  9. } else { 

  10. // error response, no access to resource? 






  11. @Override 

  12. public void onFailure(Call<User> call, Throwable t) { 

  13. // something went completely south (like no internet connection) 

  14. Log.d("Error", t.getMessage()); 





ServiceGenerator 方法将创建包含预定义认证头部的 HTTP 客户端。一旦调用 loginServicebasicLogin 方法,提供的认证信息将自动被传入到请求的 API 端点。

2. Retrofit2 -- Basic Authentication on Android的更多相关文章

  1. Atitit HTTP 认证机制基本验证 (Basic Authentication) 和摘要验证 (Digest Authentication)attilax总结

    Atitit HTTP认证机制基本验证 (Basic Authentication) 和摘要验证 (Digest Authentication)attilax总结 1.1. 最广泛使用的是基本验证 ( ...

  2. Nancy 学习-身份认证(Basic Authentication) 继续跨平台

    开源 示例代码:https://github.com/linezero/NancyDemo 前面讲解Nancy的进阶部分,现在来学习Nancy 的身份认证. 本篇主要讲解Basic Authentic ...

  3. HTTP Basic Authentication

    Client端发送请求, 要在发送请求的时候添加HTTP Basic Authentication认证信息到请求中,有两种方法:1. 在请求头中添加Authorization:    Authoriz ...

  4. Web services 安全 - HTTP Basic Authentication

    根据 RFC2617 的规定,HTTP 有两种标准的认证方式,即,BASIC 和 DIGEST.HTTP Basic Authentication 是指客户端必须使用用户名和密码在一个指定的域 (Re ...

  5. Web API 基于ASP.NET Identity的Basic Authentication

    今天给大家分享在Web API下,如何利用ASP.NET Identity实现基本认证(Basic Authentication),在博客园子搜索了一圈Web API的基本认证,基本都是做的Forms ...

  6. PYTHON实现HTTP基本认证(BASIC AUTHENTICATION)

    参考: http://www.voidspace.org.uk/python/articles/authentication.shtml#id20 http://zh.wikipedia.org/wi ...

  7. HTTP Basic Authentication认证的各种语言 后台用的

    访问需要HTTP Basic Authentication认证的资源的各种语言的实现 无聊想调用下嘀咕的api的时候,发现需要HTTP Basic Authentication,就看了下. 什么是HT ...

  8. 一个HTTP Basic Authentication引发的异常

    这几天在做一个功能,其实很简单.就是调用几个外部的API,返回数据后进行组装然后成为新的接口.其中一个API是一个很奇葩的API,虽然是基于HTTP的,但既没有基于SOAP规范,也不是Restful风 ...

  9. HTTP Basic Authentication认证(Web API)

    当下最流行的Web Api 接口认证方式 HTTP Basic Authentication: http://smalltalllong.iteye.com/blog/912046 什么是HTTP B ...

随机推荐

  1. DevExpress组件AspxCallBack之传递数值到客户端多个控件

    AspxCallBack从服务器传值到客户端单个控件可以用CallbackEventArgs的e.Result来传值,下面是传值多个控件的做法. ASPX页面代码: <dx:ASPxCallba ...

  2. OTL调用存储过程/函数及注意事项

    OTL 是 Oracle, Odbc and DB2-CLI Template Library 的缩写,是一个 C++ 编译中操控关系数据库的模板库,它目前几乎支持所有的当前各种主流数据库. OTL  ...

  3. 使用Fabric模块实现自动化运维

    一.安装软件 简介:Fabric是基于Python实现的SSH命令行工具,简化了SSH的应用程序部署及系统管理任务,它提供了系统基础的操作组件,可以实现本地或远程shell命令,包括:命令执行.文件上 ...

  4. MySQL建表设置外键提示错误

    错误内容: ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to ...

  5. [Angular] Two things about OnChanges Lifecycle hook

    1. ngOnChanges is called before ngOnInit but after constructor() 2. ngOnChanges is called because of ...

  6. Boost.Asio c++ 网络编程翻译(21)

    同步VS异步 Boost.Asio的作者做了一个非常惊艳的工作:它能够让你在同步和异步中自由选择,从而更好的适应你的应用. 在之前的章节中,我们学习了每种类型应用的框架,比方同步client,同步服务 ...

  7. python 使用 BeautifulSoup 解析html

    下载地址:http://www.crummy.com/software/BeautifulSoup/bs4/download/4.3/beautifulsoup4-4.3.2.tar.gz 说明:这个 ...

  8. Odoo环境下Ubuntu服务器性能优化--参数调整

    公司在使用Odoo进行内部信息化管理,随着业务增长,服务器性能问题变成了瓶颈,为了解决这些问题,最近的工作重点将移到性能调整上来,同时也会在此记录整个处理过程,以便日后回顾. 1.根据相关资料建议,在 ...

  9. python处理xls、xlsx格式excle

    一.windows下读取xls格式文件,所需模块xlrd.xlw 1.下载安装包 xlrd地址:https://pypi.org/project/xlrd/#files xlwt地址:https:// ...

  10. 编译的时候找不到包 但是maven denpendencies已经有这个包 。或者myeclipse 为webroot eclipse为webContext需要修改

    在Eclipse中生成项目是WebContent目录 而在MyEclipse中生成的项目目录名字好像叫做WebRoot,那么如果把MyEclipse的项目导入到Eclipse中,如果要部署项目到Tom ...