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. 【Javascript】如何实现点的wave效果 && sinewave效果

    参考资料: sinewave效果:http://www.oneapm.com/ci/docker.html?utm_source=BaiduPaid&utm_medium=cpc&ut ...

  2. linux mysql 更改MySQL数据库目录位置

    MySQL默认的数据文件存储目录为/var/lib/mysql.假如要把目录移到/home/data下需要进行下面几步: 1.home目录下建立data目录 cd /home mkdir data 2 ...

  3. java中调用kettle转换文件

    java中调用kettle转换文件 通过命令行也能够调用,然后java中调用命令行代码也能够.这样没有和java代码逻辑无缝集成.本文说明kettle5.1中假设通过其它API和java代码无缝集成: ...

  4. npm install 报错:node-pre-gyp ERR! 问题解决

    npm install报错问题解决 问题: E:\CodeSpace\GitlabTest\desktop>npm install > lifeccp-desktop@1.1.9 post ...

  5. 【大盛】全网首发HTC One/M7 最新本地化TrickDroid9.0/固件升级/永久root/高级,快速设置/稳定,流畅经典ROM

    了解更多请关注:点击打开链接 ROM版本 HTC One/M7_TrickDroid9.0.0 ROM作者 雪狼团队-大盛   http://weibo.com/DaShengdd Android版本 ...

  6. ffmpeg对rtmp的基本操作[转]

    ffplay和ffmpeg调用的库是一样的.我刚才试了一下,是可以播的.ffplay "rtmp://tsl.s1979.cutv.com:1935/cutvChannelLive/AxeF ...

  7. Unity3D优化之合并网格

    原文地址点击这里

  8. 阻塞与非阻塞、同步与异步、I/O模型

    1. 概念理解 在进行网络编程时,我们常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式: 同步/异步主要针对C端:  同步: 所谓同步,就是在c端 ...

  9. 算法笔记_084:蓝桥杯练习 11-1实现strcmp函数(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 自己实现一个比较字符串大小的函数,也即实现strcmp函数.函数:int myStrcmp(char *s1,char *s2) 按照AS ...

  10. ES6 Reflect

    1.Reflect概述 ES6 为了操作对象而提供的新 API 2.Reflect设计目的 (1)将Object对象的一些明显属于语言内部的方法(比如Object.defineProperty),放到 ...