2. Retrofit2 -- Basic Authentication on Android

android
Retrofit
tutorial

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

整合基本的认证


首先,更新 ServiceGenerator 类,添加方法,用于把认证添加到请求上。下面的代码使用 1.9、2.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. } 


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

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

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

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

  13. // create Base64 encodet string 

  14. final String basic = 

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


  16. builder.setRequestInterceptor(new RequestInterceptor() { 

  17. @Override 

  18. public void intercept(RequestFacade request) { 

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

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

  21. } 

  22. }); 

  23. } 


  24. RestAdapter adapter = builder.build(); 

  25. return adapter.create(serviceClass); 

  26. } 

  27. } 

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. } 


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

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

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

  14. final String basic = 

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


  16. httpClient.addInterceptor(new Interceptor() { 

  17. @Override 

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

  19. Request original = chain.request(); 


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

  21. .header("Authorization", basic) 

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

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


  24. Request request = requestBuilder.build(); 

  25. return chain.proceed(request); 

  26. } 

  27. }); 

  28. } 


  29. OkHttpClient client = httpClient.build(); 

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

  31. return retrofit.create(serviceClass); 

  32. } 

  33. } 

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

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

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

大多数的 webservice 和 API 都会对 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); 

  4. } 

Retrofit 2.0

  1. public interface LoginService {  

  2. @POST("/login") 

  3. Call<User> basicLogin(); 

  4. } 

上面的接口只有一个方法: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. } 


  8. @Override 

  9. public void failure(RetrofitError error) { 

  10. // handle errors, too 

  11. } 

  12. }); 

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. } 

  12. } 


  13. @Override 

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

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

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

  17. } 

  18. } 

ServiceGenerator 方法将创建包含预定义认证头部的 HTTP 客户端。一旦调用 loginService 的 basicLogin 方法,提供的认证信息将自动被传入到请求的 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. 如何监控Oracle

    介绍了DBA每天在监控Oracle数据库方面的职责,讲述了如何通过shell脚本来完成这些重复的监控工作.本文首先回顾了一些DBA常用的Unix命令,以及解释了如何通过Unix Cron来定时执行DB ...

  2. django queryset合并问题

    今天在实现搜索时遇到一个问题,如何同时搜索model里面的title以及content和category字典 contents = Blog.objects.filter(content__conta ...

  3. http://www.cnblogs.com/carekee/articles/1854674.html

    http://www.cnblogs.com/carekee/articles/1854674.html http://www.cnblogs.com/xdp-gacl/p/3926848.html

  4. 【笔记】js Array.prototype.slice.call(arguments) 将函数的参数转换为数组方法的见解

    我们知道函数里面的参数实际上是一个以数组形式储存的对象 但它并非一个数组 如果我们要将它转换为数组可以调用Array.prototype.slice() 这个方法 分析一下这个方法: Array.pr ...

  5. MVVM和MVC的区别,以及MVVM的缺点

    MVVM和MVC的区别 MVC和MVVM的区别其实并不大.都是一种设计思想. 主要就是MVC中Controller演变成MVVM中的viewModel. MVVM主要解决了MVC中大量的DOM操作使页 ...

  6. Swift教程之运算符

    import Foundation //4.复合赋值操作符 var a = 1 a += 2 //一元减运算符(一个数值前加了符号-,叫作一元减运算符) let three = 3 let minus ...

  7. arcgis的mxd数据源检查,和自动保存为相对路径

    arcgis的mxd数据源(含矢量和影像)检查,和,检查是否为相对路径,自动保存为相对路径 ArcGIS10.0和ArcGIS10.2.2测试通过 下载地址:http://files.cnblogs. ...

  8. angular -- $resource 用法

    安装 ngResource模块是一个可选的angularjs模块,如果需要使用,我们要单独引用js <script type="text/javascript" src=&q ...

  9. 用interrupt()中断Java线程

    最近在学习Java线程相关的东西,和大家分享一下,有错误之处欢迎大家指正. 假如我们有一个任务如下,交给一个Java线程来执行,如何才能保证调用interrupt()来中断它呢? class ATas ...

  10. cocos2dx 制作单机麻将(四)

    cocos2dx 制作单机麻将(四) 麻将逻辑5.模拟出牌 // // main.cpp // MajiangLogicTest // // Created by TinyUlt on 14-8-16 ...