REST

87 阅读3分钟

REST -- REpresentational State Transfer

首先,之所以晦涩是因为前面主语被去掉了,全称是 Resource Representational State Transfer:通俗来讲就是:资源在网络中以某种表现形式进行状态转移。分解开来:

Resource:资源,即数据(前面说过网络的核心)。比如 newsfeed,friends等;

Representational:某种表现形式,比如用JSON,XML,JPEG等;

State Transfer:状态变化。通过HTTP动词实现。

  1. URL定位资源,用HTTP动词(GET,POST,DELETE,DETC)描述操作。

  2. Server提供的RESTful API中,URL中只使用名词来指定资源,原则上不使用动词。“资源”是REST架构或者说整个网络处理的核心。

  3. HTTP协议里的动词来实现资源的添加,修改,删除等操作。即通过HTTP动词来实现资源的状态扭转:

image.png

Server的API如何设计才满足RESTful要求?

首先是简洁版里面的那几点。外加一些附带的 best practices:

  1. URL root: example.org/api/v1/

api.example.com/v1/

  1. API versioning:

可以放在URL里面,也可以用HTTP的header:

/api/v1/

  1. URI使用名词而不是动词,且推荐用复数。

BAD

  • /getProducts
  • /listOrders
  • /retrieveClientByOrder?orderId=1

GOOD

  • GET /products : will return the list of all products
  • POST /products : will add a product to the collection
  • GET /products/4 : will retrieve product #4
  • PATCH/PUT /products/4 : will update product #4
  1. 保证 HEAD 和 GET 方法是安全的,不会对资源状态有所改变(污染)。比如严格杜绝如下情况:

GET /deleteProduct?id=1

  1. 资源的地址推荐用嵌套结构。比如:

GET /friends/10375923/profile

UPDATE /profile/primaryAddress/city6. 警惕返回结果的大小。如果过大,及时进行分页(pagination)或者加入限制(limit)。HTTP协议支持分页(Pagination)操作,在Header中使用 Link 即可。

  1. 使用正确的HTTP Status Code表示访问状态:

HTTP/1.1: Status Code Definitions

  1. 在返回结果用明确易懂的文本(String。注意返回的错误是要给人看的,避免用 1001 这种错误信息),而且适当地加入注释。

  2. 关于安全:自己的接口就用https,加上一个key做一次hash放在最后即可。考虑到国情,HTTPS在无线网络里不稳定,可以使用Application Level的加密手段把整个HTTP的payload加密。有兴趣的朋友可以用手机连上电脑的共享Wi-Fi,然后用Charles监听微信的网络请求(发照片或者刷朋友圈)。

如果是平台的API,可以用成熟但是复杂的OAuth2,新浪微博这篇: 授权机制说明

我们一起来看看RESTFul API有哪些特点:

  1. 基于“资源”,数据也好、服务也好,在RESTFul设计里一切都是资源。
  2. 无状态。一次调用一般就会返回结果,不存在类似于“打开连接-访问数据-关闭连接”这种依赖于上一次调用的情况。
  3. URL中通常不出现动词,只有名词
  4. URL语义清晰、明确
  5. 使用HTTP的GET、POST、DELETE、PUT来表示对于资源的增删改查
  6. 使用JSON不使用XML
    我举个例子:
    网站:/get_user?id=3
    RESTFul: GET /user/3 (GET是HTTP类型)

各端的具体实现

如上面的图所示,Server统一提供一套RESTful API,web+ios+android作为同等公民调用API。各端发展到现在,都有一套比较成熟的框架来帮开发者事半功倍。

-- Server --

推荐: Spring MVC 或者 Jersey 或者 Play Framework

教程: Getting Started · Building a RESTful Web Service

-- Web --

推荐随便搞!可以用重量级的AngularJS,也可以用轻量级 Backbone + jQuery 等。

教程: blog.javachen.com/2015/01/06/…

参考:

[1]: Some REST best practices

[2]: GitHub API v3

[3]: tlhunter/consumer-centric-api-design · GitHub