RESTful API已经非常成熟,也得到了大家的认可。本文主要讲的是在工作中遇到的一个比较被认同的“规范”,总结下自己的经验。
按照Richardson Maturity Mode对REST评价的模型,规范基于level2来设计。
资源
路径
路径,API的具体地址。在REST中,每个地址都代表一个具体的资源(Resource)。所以就有了以下的约定:
- 路径仅表示资源的路径(位置),以及一些特殊的actions操作。
- 以复数(名词)进行命名资源,不管返回单个或者多个资源。
- 使用小写字母、数字以及下划线(“_”)。(下划线是为了区分多个单词,如token_access)。
- 资源的路径从父到子依次如:/{resource}/{resource_id}/{sub_resource}/{sub_resource_id}/{sub_resource_property}。
- 使用?来进行资源的过滤、搜索以及分页等。
- 使用版本号,且版本号在资源路径之前。
- 优先使用内容协商来区分表述格式,而不是使用后缀来区分表述格式。
- 应该放在一个专用的域名下,如:http://api.webfuse.cn。
- 建议使用SSL。
综上,一个API路径可能会是
https://api.webfuse.cn/v0.1/{resource}/{resource_id}/{sub_resource}/{sub_resource_id}/{sub_resource_property}
https://api.webfuse.cn/v0.1/{resource}?limit=10&offset=10
https://api.webfuse.cn/v0.1/{resource}?page=1&page_size=10
https://api.webfuse.cn/v0.1/{resource}?sortby=name&order=asc
操作
用HTTP动词(方法)表示对资源的具体操作。常用的HTTP动词有:
GET:从服务器取出资源(一项或多项)。
POST:在服务器新建一个资源。
PUT:在服务器更新资源(客户端提供改变后的完整资源,全部更新)。
PATCH:在服务器更新资源(客户端提供改变的属性,部分更新)。
DELETE:从服务器删除资源。
HEAD:获取资源的元数据。
OPTIONS:获取信息,关于资源的哪些属性是客户端可以改变的。
所以,
GET https://api.webfuse.cn/v0.1/users 获得用户列表
GET https://api.webfuse.cn/v0.1/users/{id} 获得指定的用户
POST https://api.webfuse.cn/v0.1/users 创建一个用户
PUT https://api.webfuse.cn/v0.1/users/{id} 更新指定的用户(提供该用户的全部信息)
PATCH https://api.webfuse.cn/v0.1/users/{id} 更新指定的用户(提供该用户的部分信息)
DELETE https://api.webfuse.cn/v0.1/users/{id} 删除指定的用户
数据
数据是对资源的具体描述,分为请求数据和返回数据。约定如下:
- 查询,过滤条件使用query string。
- Content body 仅仅用来传输数据。
- 通过Content-Type指定请求与返回的数据格式。其中请求数据还要指定Accept。
- 数据应该拿来就能用,不应该还要进行转换操作。
- 使用ISO-8601格式表达时间字段,例如: 2014-04-05T14:30Z。
- 采用UTF-8编码。
- 返回的数据应该尽量简单,响应状态应该包含在响应头中。
- 使用小写字母、数字以及下划线(“_”)描述字段,不使用大写描述字段。
- 建议资源使用UUID最为唯一标识。同时建议命名为id。
- 属性和字符串值必须使用双引号””。
- 建议对每个字段设置默认值(数组型可设置为[],字符串型可设置为””,数值可设置为0,对象可设置为{}),这一条是为了方便前端/客户端进行判断字段存不存在操作。
- POST操作应该返回新建的资源;PUT/PATCH操作返回更新后的完整的资源;DELETE返回一个空文档;GET返回资源数组或当个资源;
- 为了方便以后的扩展兼容,如果返回的是数组,强烈建议用一个包含如items属性的对象进行包裹。如:
{"items":[{},{}]}
所以,一个请求以及返回的数据结构可能如:
POST https://api.webfuse.cn/v0.1/users
Request
headers:
Accept: application/json
Content-Type: application/json;charset=UTF-8
body:
{
"user_name": "HingKwan",
"id":"550e8400-e29b-41d4-a716-446655440000"
}
Response
status: 201 Created
headers:
Content-Type: application/json;charset=UTF-8
body:
{
"user_name": "HingKwan",
"id":"550e8400-e29b-41d4-a716-446655440000"
}
安全
调用限制
为了避免请求泛滥,给API设置速度限制很重要。入速度设置之后,可以在HTTP返回头上对返回的信息进行说明,下面是几个必须的返回头(依照twitter的命名规则):
X-Rate-Limit-Limit :当前时间段允许的并发请求数
X-Rate-Limit-Remaining:当前时间段保留的请求数。
X-Rate-Limit-Reset:当前时间段剩余秒数
授权校验
RESTful API是无状态的也就是说用户请求的鉴权和cookie以及session无关,每一次请求都应该包含鉴权证明。
可以使用http请求头Authorization设置授权码; 必须使用User-Agent设置客户端信息, 无User-Agent请求头的请求应该被拒绝访问。具体的授权可以采用OAuth2,或者自己定义并实现相关的授权验证机制(基于token)。
常见的请求Header为:
User-Agent: Data-Server-Client
Authorzation: Bearer 383w9JKJLJFw4ewpie2wefmjdlJLDJF
或
User-Agent: Data-Server-Client
Authorzation: MAC id="2YotenFZFEjrizCsicMWpBA",nonce="14187532423423:adfadsfa",mac="SfadfaFdafadfdasFFyu"
以上两个代码只是列出来可以采用的格式,具体的实现可以根据各项目具体规划。
错误
当API返回非2XX的HTTP响应时,应该采用统一的响应信息,格式如:
HTTP/1.1 400 Bad Request
Content-Type: application/json;charset=UTF-8
{
"code":"INVALID_ARGUMENT",
"message":"{error message}",
"request_id":"",
"host_id":"{server identity}",
"server_time":"2016-05-17T22:08:00Z"
"document":"https://developer.webfuse.cn/v0.1/errors/400"
}
- HTTP Header Code:符合HTTP响应的状态码。详细见以下的“状态码”节。
- code:用来表示某类错误,比如缺少参数等。是对HTTP Header Code的补充,开发团队可以根据自己的需要自己定义。
- message:错误信息的摘要,应该是对用户处理错误有用的信息。
- request_id:请求的id,方便开发定位发生错误的请求(可选)。
- host_id:服务器实例的ID,方便开发定位是哪台服务器实例发生了错误(可选)。
- server_time:发生错误时候的服务器时间(可选)。
- document:错误解决的文档(方便前端展示,可选)。
code的定义约定:
- 采用大写字母命名,字母与字母之间用下划线(”_”)隔开。
- 采用{biz_name}/{err_code}的命名结构。其中biz_name为业务名称的缩写。
- code应该用来定义错误类别,而非定义具体的某个错误。
状态码
为每个请求返回适当的状态码,状态码可以参考HTTP的状态码。
常用的状态码有:
200 ok - 成功返回状态,对应,GET,PUT,PATCH,DELETE。
201 created - 成功创建。
304 not modified - HTTP缓存有效。
400 bad request - 请求格式错误。
401 unauthorized - 未授权。
403 forbidden - 鉴权成功,但是该用户没有权限。
404 not found - 请求的资源不存在
405 method not allowed - 该http方法不被允许。
410 gone - 这个url对应的资源现在不可用。
415 unsupported media type - 请求类型错误。
422 unprocessable entity - 校验错误时用。
429 too many request - 请求过多。
500 internal server error - 通用错误响应。
503 service unavailable - 服务当前无法处理请求。
相关推荐
### RESTful API设计规范详解 #### 一、RESTful简介 RESTful是一种广泛应用于Web服务的设计风格,全称为Representational State Transfer(表述性状态转移)。它并非一项具体的技术标准,而是一系列设计原则和约束...
REST它是一种使用URL来定位资源,使用HTTP请求描述操作的Web服务规范,本资源包含RESTful简介、设计原则、通用说明、规范细则、接口管理说明。
这个脚本需要解析接收到的HTTP请求,根据RESTful API规范执行相应操作,并生成响应。例如,如果使用Python,你可以使用`flask`这样的微框架来简化这一过程。 **五、安全与性能优化** 在部署lighttpd RESTful API和...
在开发RESTful接口时,我们需要遵循一定的设计规范来确保接口的一致性、可维护性和易用性。RESTful API(Representational State ...通过综合这些最佳实践和规范,我们可以构建出既强大又易于使用的RESTful API。
11111111111111111111111111111111111111111111111111111111111111111111111111111111111
在设计API时,开发者需要确保按照这些规范来处理对应的请求。 其次,响应请求时,服务器需要返回特定的状态码和数据。成功获取资源(GET)、部分更新资源(PATCH)和完全更新资源(PUT)的情况下,通常返回200状态...
RESTful API 有一系列规范,满足这些规范的 API 均可称为 RESTful API。RESTful API 的核心包括: 1. 在 RESTful API 中一切实体都被抽象成资源,每个资源有一个唯一的标识 —— URI,所有的行为都应该是在资源上的...
路径是指RESTful API的具体地址,其设计应当遵循一定的规范。在RESTful架构中,每个URL代表一种资源(resource),因此路径中不应包含动词,而只应包含名词,并且这些名词通常与数据库表名相对应。例如,一个动物园...
在本文中,我们将详细介绍 API 接口规范的重要性、Restful API 规范、API 规范、参数及响应规范等方面的知识点。 一、API 接口规范的重要性 良好的 API 接口规范可以提高工作效率,减少沟通障碍。设计 API 意味着...
基于 RESTful 架构的 API 设计原则和规范 RESTful 架构是目前最流行的一种互联网软件架构,它结构清晰、符合标准、易于理解、扩展方便,基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。因此...
### 基于 Go 语言构建企业级的 RESTful API 服务 #### 一、概述 本文档旨在介绍如何利用 Go 语言构建一个稳定、高效的企业级 RESTful API 服务。Go 语言以其简洁的语法、强大的并发能力及内置的 HTTP 服务器库等...
这些工具可以从注释或特定的规范文件中解析API的信息,自动生成易于理解和使用的文档。在TP5项目中,开发者可以在控制器方法上方添加注释,描述接口的用途、参数、返回值等信息,然后通过apidoc.js等工具读取这些...
在这个项目“Springboot_restful_api”中,开发者使用了SpringBoot来构建RESTful风格的API,这是一种广泛用于现代Web服务的设计模式,允许客户端和服务器之间通过HTTP协议交换信息。 REST(Representational State ...
它强调了简洁、可读性、无状态和缓存等原则,使得API(Application Programming Interface)设计更加规范和高效。RESTful API的设计主要遵循以下原则和最佳实践: 1. **资源导向**:RESTful API的核心是资源,每个...
在这个"OPC-RestfulAPI-net.rar"压缩包中,包含了一个名为"OPC-RestfulAPI-net.exe"的执行文件,这很可能是一个演示程序,将OPC服务器的功能转换为可以通过Web API访问的形式。Web API是一种创建HTTP服务的方法,...
### RESTful-API设计原则与规范 #### 一、背景与基础概念 RESTful架构作为一种流行的互联网软件架构,因其结构清晰、符合标准、易于理解和扩展等特点而受到广泛青睐。REST(Representational State Transfer)的...
"restful工具支持最新版本"意味着这款工具已经升级到能够兼容最新的RESTful API规范,提供更好的性能、安全性和易用性。 这些工具可能包括以下功能: 1. **API设计与文档生成**:支持OpenAPI(以前称为Swagger)...