十堰市建设工程管理处网站,网站右侧广告代码,用自建网站做外贸,公司网站大顶图怎么做转载自 RESTful API 最佳实践
RESTful 是目前最流行的 API 设计规范#xff0c;用于 Web 数据接口的设计。
它的大原则容易把握#xff0c;但是细节不容易做对。本文总结 RESTful 的设计细节#xff0c;介绍如何设计出易于理解和使用的 API。 一、URL 设计
1.1 动词 宾…转载自 RESTful API 最佳实践
RESTful 是目前最流行的 API 设计规范用于 Web 数据接口的设计。
它的大原则容易把握但是细节不容易做对。本文总结 RESTful 的设计细节介绍如何设计出易于理解和使用的 API。 一、URL 设计
1.1 动词 宾语
RESTful 的核心思想就是客户端发出的数据操作指令都是动词 宾语的结构。比如GET /articles这个命令GET是动词/articles是宾语。
动词通常就是五种 HTTP 方法对应 CRUD 操作。 GET读取ReadPOST新建CreatePUT更新UpdatePATCH更新Update通常是部分更新DELETE删除Delete根据 HTTP 规范动词一律大写。
1.2 动词的覆盖
有些客户端只能使用GET和POST这两种方法。服务器必须接受POST模拟其他三个方法PUT、PATCH、DELETE。
这时客户端发出的 HTTP 请求要加上X-HTTP-Method-Override属性告诉服务器应该使用哪一个动词覆盖POST方法。 POST /api/Person/4 HTTP/1.1
X-HTTP-Method-Override: PUT上面代码中X-HTTP-Method-Override指定本次请求的方法是PUT而不是POST。
1.3 宾语必须是名词
宾语就是 API 的 URL是 HTTP 动词作用的对象。它应该是名词不能是动词。比如/articles这个 URL 就是正确的而下面的 URL 不是名词所以都是错误的。 /getAllCars/createNewCar/deleteAllRedCars1.4 复数 URL
既然 URL 是名词那么应该使用复数还是单数
这没有统一的规定但是常见的操作是读取一个集合比如GET /articles读取所有文章这里明显应该是复数。
为了统一起见建议都使用复数 URL比如GET /articles/2要好于GET /article/2。
1.5 避免多级 URL
常见的情况是资源需要多级分类因此很容易写出多级的 URL比如获取某个作者的某一类文章。 GET /authors/12/categories/2这种 URL 不利于扩展语义也不明确往往要想一会才能明白含义。
更好的做法是除了第一级其他级别都用查询字符串表达。 GET /authors/12?categories2下面是另一个例子查询已发布的文章。你可能会设计成下面的 URL。 GET /articles/published查询字符串的写法明显更好。 GET /articles?publishedtrue二、状态码
2.1 状态码必须精确
客户端的每一次请求服务器都必须给出回应。回应包括 HTTP 状态码和数据两部分。
HTTP 状态码就是一个三位数分成五个类别。 1xx相关信息2xx操作成功3xx重定向4xx客户端错误5xx服务器错误这五大类总共包含100多种状态码覆盖了绝大部分可能遇到的情况。每一种状态码都有标准的或者约定的解释客户端只需查看状态码就可以判断出发生了什么情况所以服务器应该返回尽可能精确的状态码。
API 不需要1xx状态码下面介绍其他四类状态码的精确含义。
2.2 2xx 状态码
200状态码表示操作成功但是不同的方法可以返回更精确的状态码。 GET: 200 OKPOST: 201 CreatedPUT: 200 OKPATCH: 200 OKDELETE: 204 No Content上面代码中POST返回201状态码表示生成了新的资源DELETE返回204状态码表示资源已经不存在。
此外202 Accepted状态码表示服务器已经收到请求但还未进行处理会在未来再处理通常用于异步操作。下面是一个例子。 HTTP/1.1 202 Accepted{task: {href: /api/company/job-management/jobs/2130040,id: 2130040}
}2.3 3xx 状态码
API 用不到301状态码永久重定向和302状态码暂时重定向307也是这个含义因为它们可以由应用级别返回浏览器会直接跳转API 级别可以不考虑这两种情况。
API 用到的3xx状态码主要是303 See Other表示参考另一个 URL。它与302和307的含义一样也是暂时重定向区别在于302和307用于GET请求而303用于POST、PUT和DELETE请求。收到303以后浏览器不会自动跳转而会让用户自己决定下一步怎么办。下面是一个例子。 HTTP/1.1 303 See Other
Location: /api/orders/123452.4 4xx 状态码
4xx状态码表示客户端错误主要有下面几种。
400 Bad Request服务器不理解客户端的请求未做任何处理。
401 Unauthorized用户未提供身份验证凭据或者没有通过身份验证。
403 Forbidden用户通过了身份验证但是不具有访问资源所需的权限。
404 Not Found所请求的资源不存在或不可用。
405 Method Not Allowed用户已经通过身份验证但是所用的 HTTP 方法不在他的权限之内。
410 Gone所请求的资源已从这个地址转移不再可用。
415 Unsupported Media Type客户端要求的返回格式不支持。比如API 只能返回 JSON 格式但是客户端要求返回 XML 格式。
422 Unprocessable Entity 客户端上传的附件无法处理导致请求失败。
429 Too Many Requests客户端的请求次数超过限额。
2.5 5xx 状态码
5xx状态码表示服务端错误。一般来说API 不会向用户透露服务器的详细信息所以只要两个状态码就够了。
500 Internal Server Error客户端请求有效服务器处理时发生了意外。
503 Service Unavailable服务器无法处理请求一般用于网站维护状态。
三、服务器回应
3.1 不要返回纯本文
API 返回的数据格式不应该是纯文本而应该是一个 JSON 对象因为这样才能返回标准的结构化数据。所以服务器回应的 HTTP 头的Content-Type属性要设为application/json。
客户端请求时也要明确告诉服务器可以接受 JSON 格式即请求的 HTTP 头的ACCEPT属性也要设成application/json。下面是一个例子。 GET /orders/2 HTTP/1.1
Accept: application/json3.2 发生错误时不要返回 200 状态码
有一种不恰当的做法是即使发生错误也返回200状态码把错误信息放在数据体里面就像下面这样。 HTTP/1.1 200 OK
Content-Type: application/json{status: failure,data: {error: Expected at least two items in list.}
}上面代码中解析数据体以后才能得知操作失败。
这张做法实际上取消了状态码这是完全不可取的。正确的做法是状态码反映发生的错误具体的错误信息放在数据体里面返回。下面是一个例子。 HTTP/1.1 400 Bad Request
Content-Type: application/json{error: Invalid payoad.,detail: {surname: This field is required.}
}3.3 提供链接
API 的使用者未必知道URL 是怎么设计的。一个解决方法就是在回应中给出相关链接便于下一步操作。这样的话用户只要记住一个 URL就可以发现其他的 URL。这种方法叫做 HATEOAS。
举例来说GitHub 的 API 都在 api.github.com 这个域名。访问它就可以得到其他 URL。 {...feeds_url: https://api.github.com/feeds,followers_url: https://api.github.com/user/followers,following_url: https://api.github.com/user/following{/target},gists_url: https://api.github.com/gists{/gist_id},hub_url: https://api.github.com/hub,...
}上面的回应中挑一个 URL 访问又可以得到别的 URL。对于用户来说不需要记住 URL 设计只要从 api.github.com 一步步查找就可以了。
HATEOAS 的格式没有统一规定上面例子中GitHub 将它们与其他属性放在一起。更好的做法应该是将相关链接与其他属性分开。 HTTP/1.1 200 OK
Content-Type: application/json{status: In progress,links: {[{ rel:cancel, method: delete, href:/api/status/12345 } ,{ rel:edit, method: put, href:/api/status/12345 }]}
}四、参考链接
RESTful API Design: 13 Best Practices to Make Your Users Happy, by Florimond MancaAPI design, by MicroSoft Azure
完