微服务架构与应用微服务php技术

你构建的API够RESTful吗?

2018-09-13  本文已影响122人  魔镜的技术心经

背景

很多团队都在构建API,并且声称自己团队创建的API都是足够的RESTful,今天我们简单聊下RESTful API相关的一些概念和设计实践。

定义

REST(Representational State Transfer) - 表述性状态转移

简单一句是就指: 服务器发送表述用于描述资源的当前状态,客户端发送表述用于描述客服端希望资源拥有的状态。

REST 是一种架构风格。定义了分布式系统中,各个组件之间的交互方式。

Richardson成熟度模型

image.png
GET /books?author=“john”

Response:
[
{“id”:11, “Game of thrones”},
{“id”:22, “Notre Dame de Paris”}
]

GET /orders?action=create&bookId=11&quantity=2

Response:
{
“id”: 3,
“book-id”: 11,
“quantity”: 2
}

GET /orders/3/delete
GET /books?author=“john”

200 OK
[
{“id”:11, “Game of thrones”},
{“id”:22, “Notre Dame de Paris”}
]

POST /orders
{
“bookId”: 11
“quantity”: 2,
}

201 CREATED
Location: /orders/3
 
{
“id”: “3”
“bookId”: 11
“quantity”: 2
}

DELETE /orders/3
GET /books?author=“john”

200 OK
{
“data”: {
[
{“id”:11, “Game of thrones”},
{“id”:22, “Notre Dame de Paris”}
]
},
“links”: {
“self”: “/books?author=john”
“order”: “/orders”
}
}

POST /orders
{
“bookId”: 11
“quantity”: 2,
}

201 CREATED
Location: /orders/3
 
{
“data”:{
“id”: “3”
“bookId”: 11
“quantity”: 2
},
“links”: {
“self”: “/orders/3”,
“payment”: “/payments?discount=95”
}
}

DELETE /orders/3

对照以上的成熟度模型,我们可以比较明确的知道我们自己的API,属于哪个LEVEL?

API规范

无状态原则

服务端必须是没有状态的,换句话说,客户端的所有请求必须包括服务端完成请求的所有信息(e.g: 认证信息,表单数据);客户端不能假设服务端有任何的状态信息,所有的状态信息只有两种方式保持:

服务无状态,很好的方便了水平扩展,高可用。

幂等原则

一次和多次请求某一个资源应该具有相同的副作用

幂等的方法意味着请求成功执行所得到的结果不依赖于该方法被执行的次数;这在分布式事务-特别是最终一致性的时候,我们都需要保证业务服务的幂等性息息相关。

在常见的HTTP Verbs里面,GET是天然的满足幂等性,为缓存提供了条件;DELETE和PUT/PATCH都可以实现幂等。

可缓存原则

在请求和响应的过程中,任何一个节点都可能会”缓存“响应数据, 因此响应都会显式或者隐式的包含”能否被缓存“的信息, 客服端和中间涉及的节点会根据这些信息,来进行后续处理。
比如: 服务端可以使用Cache-Control等Http Header字段来控制缓存的期限,良好的缓存策略可以减少客户端-服务端的交互,降低服务端的负载,从而提供性能和可扩展性。

HTTP/1.1 200 OK
Date: Fri, 26 Mar 2018 09:33:49 GMT
Cache-Control: max-age=3600 
Last-Modified: Fri, 26 Mar 2018 09:33:49 GMT 
ETag: cde893c4

安全原则

在做API设计的的时候,以下是在实际开发中常遇到的安全问题:

兼容性原则

API设计

API的设计遵循上面的四个原则,同时需要根据业务定义资源,用URI定位资源,并用HTTP verb来操作资源。

定义Resource

一切可以被命名的信息都可以叫做资源(Resource),资源是名词,不要是动词,e.g: 一个用户关注了另一个用户,这个资源应该被定义成“关系(relationship)”,而不是“关注(follow)”。

用URI定位资源

GET /users/{id}
POST /users
PUT/PATCH /users/{id}
DELETE /users/{id}

在我们团队中,定义了设计URL的军规

JSON-API

最后,开发API的过程中,会花很多时间去和API的消费者沟通API接口的具体格式。例如Content-Type,JSON的字段的定义等等,需要耗费大量的精力,如果遵循共同的约定,可以提高开发效率,利用更普遍的工具,使开发者更加专注于开发重点,这里向大家推荐:JSON API Specification: http://jsonapi.org

GET /users/123
{
”meta”: {…},
“data”: {
“type”: “user”,
“id”: “123”,
“attributes”: {},
“relationships”: {},
},
“errors”: [],
“links”: {…},
“included”: {…}
}

参考

上一篇下一篇

猜你喜欢

热点阅读