`
usenrong
  • 浏览: 514937 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

RESTful API规范

 
阅读更多

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 API设计规范详解 #### 一、RESTful简介 RESTful是一种广泛应用于Web服务的设计风格,全称为Representational State Transfer(表述性状态转移)。它并非一项具体的技术标准,而是一系列设计原则和约束...

    RESTful API接口通用完整规范_V1.doc

    REST它是一种使用URL来定位资源,使用HTTP请求描述操作的Web服务规范,本资源包含RESTful简介、设计原则、通用说明、规范细则、接口管理说明。

    lighttpd restfulapi cgi

    这个脚本需要解析接收到的HTTP请求,根据RESTful API规范执行相应操作,并生成响应。例如,如果使用Python,你可以使用`flask`这样的微框架来简化这一过程。 **五、安全与性能优化** 在部署lighttpd RESTful API和...

    restful 接口开发规范(RESTfulAPIdesignguide)

    在开发RESTful接口时,我们需要遵循一定的设计规范来确保接口的一致性、可维护性和易用性。RESTful API(Representational State ...通过综合这些最佳实践和规范,我们可以构建出既强大又易于使用的RESTful API。

    Restful api规范.docx

    11111111111111111111111111111111111111111111111111111111111111111111111111111111111

    Python语言开发RESTful API指南

    在设计API时,开发者需要确保按照这些规范来处理对应的请求。 其次,响应请求时,服务器需要返回特定的状态码和数据。成功获取资源(GET)、部分更新资源(PATCH)和完全更新资源(PUT)的情况下,通常返回200状态...

    基于 Go 语言构建企业级的 RESTful API 服务 企业级go gin 开发框架 附带源码

    RESTful API 有一系列规范,满足这些规范的 API 均可称为 RESTful API。RESTful API 的核心包括: 1. 在 RESTful API 中一切实体都被抽象成资源,每个资源有一个唯一的标识 —— URI,所有的行为都应该是在资源上的...

    restful API

    路径是指RESTful API的具体地址,其设计应当遵循一定的规范。在RESTful架构中,每个URL代表一种资源(resource),因此路径中不应包含动词,而只应包含名词,并且这些名词通常与数据库表名相对应。例如,一个动物园...

    API接口规范,API接口安全规范

    在本文中,我们将详细介绍 API 接口规范的重要性、Restful API 规范、API 规范、参数及响应规范等方面的知识点。 一、API 接口规范的重要性 良好的 API 接口规范可以提高工作效率,减少沟通障碍。设计 API 意味着...

    基于 RESTful 架构的API设计原则和规范.docx

    基于 RESTful 架构的 API 设计原则和规范 RESTful 架构是目前最流行的一种互联网软件架构,它结构清晰、符合标准、易于理解、扩展方便,基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。因此...

    基于 Go 语言构建企业级的 RESTful API 服务.pdf

    ### 基于 Go 语言构建企业级的 RESTful API 服务 #### 一、概述 本文档旨在介绍如何利用 Go 语言构建一个稳定、高效的企业级 RESTful API 服务。Go 语言以其简洁的语法、强大的并发能力及内置的 HTTP 服务器库等...

    tp5框架开发的restful API接口自动生成文档源码.zip

    这些工具可以从注释或特定的规范文件中解析API的信息,自动生成易于理解和使用的文档。在TP5项目中,开发者可以在控制器方法上方添加注释,描述接口的用途、参数、返回值等信息,然后通过apidoc.js等工具读取这些...

    Springboot_restful_api

    在这个项目“Springboot_restful_api”中,开发者使用了SpringBoot来构建RESTful风格的API,这是一种广泛用于现代Web服务的设计模式,允许客户端和服务器之间通过HTTP协议交换信息。 REST(Representational State ...

    restful api guidelines

    它强调了简洁、可读性、无状态和缓存等原则,使得API(Application Programming Interface)设计更加规范和高效。RESTful API的设计主要遵循以下原则和最佳实践: 1. **资源导向**:RESTful API的核心是资源,每个...

    OPC-RestfulAPI-net.rar

    在这个"OPC-RestfulAPI-net.rar"压缩包中,包含了一个名为"OPC-RestfulAPI-net.exe"的执行文件,这很可能是一个演示程序,将OPC服务器的功能转换为可以通过Web API访问的形式。Web API是一种创建HTTP服务的方法,...

    RESTful-API设计原则与规范

    ### RESTful-API设计原则与规范 #### 一、背景与基础概念 RESTful架构作为一种流行的互联网软件架构,因其结构清晰、符合标准、易于理解和扩展等特点而受到广泛青睐。REST(Representational State Transfer)的...

    restful工具支持最新版本

    "restful工具支持最新版本"意味着这款工具已经升级到能够兼容最新的RESTful API规范,提供更好的性能、安全性和易用性。 这些工具可能包括以下功能: 1. **API设计与文档生成**:支持OpenAPI(以前称为Swagger)...

Global site tag (gtag.js) - Google Analytics