REST架构和RESTful api

一言以蔽之:就是用URL定位资源,用HTTP描述操作。

 

通俗易懂版:

  • 看Url就知道要什么
  • 看http method就知道干什么
  • 看http status code就知道结果如何

 

人话版

  把doSth这种动宾短语格式的action请求用sth这种名词来代替,意思是我们是访问的是网络上的某处资源。。。然后用http的四种method来偷偷摸摸的表达增删改查

 

以下是分割线

 


 

参考来源

1、什么是restful

REST全称是Representational State Transfer,中文意思是表征性状态转移。 它首次出现在2000年Roy Fielding的博士论文中,Roy Fielding是HTTP规范的主要编写者之一。

他在论文中提到:"我这篇文章的写作目的,就是想在符合架构原理的前提下,理解和评估以网络为基础的应用软件的架构设计,得到一个功能强、性能好、适宜通信的架构。REST指的是一组架构约束条件和原则。" 如果一个架构符合REST的约束条件和原则,我们就称它为RESTful架构。

REST本身并没有创造新的技术、组件或服务,而隐藏在RESTful背后的理念就是使用Web的现有特征和能力,更好地使用现有Web标准中的一些准则和约束。

虽然REST本身受Web技术的影响很深,但是理论上REST架构风格并不是绑定在HTTP上,只不过目前HTTP是唯一与REST相关的实例。 所以我们这里描述的REST也是通过HTTP实现的REST。

 

先说REST名称

REST -- REpresentational State Transfer

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

  • Resource:资源,即数据(前面说过网络的核心)。比如 newsfeed,friends等;
  • Representational:某种表现形式,比如用JSON,XML,JPEG等;
  • State Transfer:状态变化。通过HTTP动词实现。

有兴趣的可以去看看原论文

论文地址:

Fielding Dissertation: CHAPTER 5: Representational State Transfer (REST)

 

为什么要用RESTful结构?

互联网早期,网页是前端后端融在一起的,比如之前的PHP,JSP等。在之前的桌面时代问题不大,但是近年来移动互联网的发展,各种类型的Client层出不穷,RESTful可以通过一套统一的接口为 Web,iOS和Android提供服务。

另外对于广大平台来说,比如Facebook platform,微博开放平台,微信公共平台等,它们不需要有显式的前端,只需要一套提供服务的接口,于是RESTful更是它们最好的选择。

在RESTful架构下:

 

 

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

1. URL root:

 

2. API versioning:

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

/api/v1/

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

4. 保证 HEAD 和 GET 方法是安全的,不会对资源状态有所改变(污染)。比如严格杜绝如下情况:

  GET /deleteProduct?id=1

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

  GET /friends/10375923/profile

  UPDATE /profile/primaryAddress/city6.

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

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

  HTTP/1.1: Status Code Definitions

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

9. 关于安全:自己的接口就用https,加上一个key做一次hash放在最后即可。考虑到国情,HTTPS在无线网络里不稳定,可以使用Application Level的加密手段把整个HTTP的payload加密。

 

 

 

 

 

posted @ 2021-12-07 16:20  r1-12king  阅读(62)  评论(0编辑  收藏  举报