摘要:今年一直断断续续在做一个基于昊哥的一套很重的REST API的Android Client,其实也是第一次做Android,而且是按照Google I/O 2010 – Android REST client applications(请自行翻墙:)的指导做一个REST的客户端,遇到各种问题所以特地记录一下。第一篇就概述一下:

1.REST API以及我所调用的的REST API的特点

2.Google I/O大会上提出的Android REST Client的建议架构

一、关于REST API

REST架构的优势,广泛应用这些废话就不说了,网上的讨论都已经够多了,有兴趣的Google之吧,而REST的核心概念,解析这些我的另一个系列《REST学习实践》会陆续添加,这里就不赘述了。简单的说就是:1.用Url表示资源 2.对资源的操作包括获取、创建、修改和删除资源,这些操作正好对应 HTTP 协议提供的 GET、POST、PUT 和 DELETE 方法

二、从Dev角度总结我所调用的REST API的特点

1.提供两种Data Formats,JSON和XML,我用的JSON,插播一段JSON简介吧:

   JSON是一种传递对象的语法,对象可以是name/value对,数组和其他对象。

   下面是段JSON代码

   1: {

   2:     "skillz": {

   3:         "web": [{

   4:             "name": "html",

   5:             "years": "5"

   6:         },

   7:         {

   8:             "name": "css",

   9:             "years": "3"

  10:         }],

  11:         "database": [{

  12:             "name": "sql",

  13:             "years": "7"

  14:         }]

  15:     }

  16: }

使用JSON的原因主要是JSON的解析速度据称比XML快10倍,其实Javascript上用的更多一些,有比较好的支持。

2.Authentication 权限

由于REST本身并没有标准,所以似乎并没有对权限这块做什么规定,在一些需要登录使用的API上我们用的是一套类似于OAuth的授权机制:

     a.向REST Service请求Login

     b.取得一个临时Token

     c.在一段时间内在HTTP Header带Token请求受保护的内容

至于Token的生成和更新就是Server端的工作了。

3.REST Request Url内嵌查询表达式

昊哥的REST Service提供了一套强大的查询表达式,类似于一个简单的编译器,Client可以在Request中带类似“q=AND(keyword:智能手机)(NOT(keyword:Nokia))(price:<1000)(city:~湖北~武汉)”来查询“在武汉1000元以下不是Nokia的智能手机”.

那么在这套REST API当中一个标准请求的Example就是

http://www.restexample.com/items/@all?c={PAGEINDEX}&max-results={PAGESIZE}&q={QUERYEXPRESSION}&orderby={ORDERBY}&partial={WANTEDFIELDS}

三、Google I/O 2010 Session上建议的Android REST Client App的架构

第一篇的话我就先抛个引子吧,上两个Session里的架构示例:
1.错误的范例
Android_rest_wrong
这其实还算是一般HTTP Client写法中比较好的,因为另开线程去处理HTTP Client,不会阻塞UI线程,但缺点也一样突出:
     Android OS可能会随时干掉这个Activity,比如在运行APP的时候突然接个电话就有可能被杀死,那么数据没有持久化的话,只能再次请求,这样糟糕的体验加过多流量足以让用户跟你的APP说滚蛋了……..
2.最佳范例
Android_rest
这是Google I/O上主推的建议Android REST Client,它的优点自然是解决了上面例子的缺点了,但Google不太厚道呀,说了自己的Android 上GMail,GReader等都是用这套架构完成的,却没给Demo代码,这里面用到的IntentService和ResultReceiver的文档支持也很少,搞得各大论坛上都有人讨论但实现的方案倒不多,希望本系列能给出一个比较完整的解决方案吧~~
 
本文就完了,下一篇主要对比Google I/O Session上的Android REST Client架构……….
 

PS:关于昊哥很重的WCF REST Service,有兴趣的可传送至昊哥的Blog文章我的WCF4 Rest Service及Entity Framework with POCO之旅