问题

使用spring-android-auth时,其使用的RestTemplate是依赖包spring-android-rest-template中的,而是spring-web-mvc中的。该RestTemplate`使用http request默认的逻辑如下

1
2
3
4
5
6
7
private static final boolean HTTP_COMPONENTS_AVAILABLE = ClassUtils.isPresent("org.apache.http.client.HttpClient", ClientHttpRequestFactory.class.getClassLoader());
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD) {
this.requestFactory = new SimpleClientHttpRequestFactory();
} else {
this.requestFactory = new HttpComponentsClientHttpRequestFactory();
}

阅读更多

Google Guice 支持自定义Scope,当然通常情况下我们不需要自己实现Scope。RoboGuice作为Android的IOC容器,实现了基于当前Context的ContextScope。我们可以根据自己需求自定义Scope,实现一些特殊的需求。GitHub的Android客户端定义了一个AccountScope,实现了基于当前账户的上下文对象的注入。

阅读更多

Gradle plugin packages up reusable pieces of build logic, which can be used across many different projects and builds.

Packaging a plugin

Build script

You can include the source for the plugin directly in the build script. This has the benefit that the plugin is automatically compiled and included in the classpath of the build script without you having to do anything. However, the plugin is not visible outside the build script, and so you cannot reuse the plugin outside the build script it is defined in.

阅读更多

对用Android的Authenticator,官方的API Guides是似乎没有很好的介绍文档,Reference中也只是简单地介绍了一下。虽然sync-adapters中对于Authenticator有提及,但是对于其用法也没有一个完整的认识,所以对其进行一定的学习并且记录了下来。

为什么需要Account Manager

我们完全可以自己自己的账户管理机制,提交一个登录表单到服务器然后返回一个认证token。但是通常覆盖不到一些细节,如果用户在另外一客户端修改了密码怎么办;认证token的过期处理;单点登录的实现。这些东西实现起来还是挺麻烦的,但是如果Android的认证框架已经实现了这些功能,并且额外提供了用户数据同步等额外的功能,那还有理由不使用它吗?Stop Trying to Reinvent the Wheel.

阅读更多

Spring Integration 的 Type Conversion

Datatype Channel

Datatype Channel 可以指定Channel接收的数据的数据类型

1
2
<int:channel id="numberChannel" datatype="java.lang.Number"/>
<int:channel id="stringOrNumberChannel" datatype="java.lang.String,java.lang.Number"/>

指定了datatype之后,如果Channel收到了类型不是指定的类型,会如下进行:

  1. 查找是否定义了一个叫做”integrationConversionService”的Bean,该Bean是Spring’s Conversion Service的实例。如果没有,则会抛出异常。
  2. 如果存在,则会尝试使用它将Message的Payload类型转换为Channel的datatype

阅读更多

介绍

Spring Social可以用来连接Software-as-a-Service (SaaS) 服务商提供了REST API,Spring的项目本身已经提供了对Facebook, Twitter, Linkedin, Github等服务商的REST API的连接。
实际在开发app的过程中,通常是需要本地app连接到后台服务器的REST API的。客户端的开发本身可能还会涉及相对复杂的验证机制,比如OAuth Dance(客户端和服务器来回交互获取access token的过程),Spring Social为客户端的开发提供了一套框架,包括连接的建立,对API的强类型绑定,应用可以直接通过客户端访问需要的API。

阅读更多

概述

OAuth2.0的最好的文档,莫过于RFC 6749。OAuth2.0本身是一个比较灵活的标准,能够适配应用到各种场景。本文主要是对文档的翻译以及加上部分个人的理解。

角色

OAuth定义了4个角色

  • resource owner
    能够对受保护的资源进行授权的实体。当resource owner是人的时候,它是指终端用户
  • resource server
    持有受保护的资源的服务器,使用access tokens能够接收和响应对受保护资源的请求
  • client
    在resource owner的行为和授权下,请求受保护资源的应用。“client”没有特指任何实现特性(比如,无论应用执行在服务器,桌面或者其他设备上)
  • authorization server
    当成功认证了resource owner并且获得授权后,分发access tokensclient的服务器。

阅读更多

关于RESTful API Versioning,有很多讨论 Nobody Understands REST or HTTP, Versioning REST Services, best-practices-for-api-versioning, How are REST APIs versioned?, 总结如下。

为什么需要Versioning

尽管设计API的时候,我们尽可能设计完美的API,尽可能的避免修改API。但是随着业务需求的变更,API接口的变化几乎是无法避免的。

当业务需求变更的时候,可以这样选择:

  1. 保持接口的兼容性。这是一种方式,但是并非能切实做到的,为了兼容必定会损失一些新特性,或者牺牲良好的代码为代价。
  2. 修改API接口的同时,修改客户端。除非自己维护少量的客户端,否则这几乎是不现实的。
  3. 保留旧的接口,通过版本来实现API接口的变更。

通常情况下,我们会选择第三种方式来实现API接口的变更。

阅读更多

Fork me on GitHub