REST APIs 旨在通过HTTP 的动作语义METHOD, 以替代各种传统CRUD 操作所带来的命名问题,例如 "/userAdd"、"/userDelete"、"/userUpdate"、"/userGet"。 REST API 使得你可以仅通过 "/user" + METHOD 替代上述不同的路由。

使用以下提供的信息以帮助确定何种Method,以应用不同场景:

1.HTTP GET

使用 GET 请求获取资源信息 - 且不要以任何方式修改资源,因为 GET 请求不提倡修改资源状态,由此也被称为safe methods。

此外,GET APIs 应该是等幂的。 即除非其他的 API (POST or PUT) 修改了服务器资源状态,任何时候发送多次完全相同的 GET 请求应当返回完全相同的数据。

1.1 GET API 响应码#Response Codes

  • 对于任何给定的 HTTP GET API。 如果能在服务器上找到相应的资源,都必须返回 code 200(ok) -以及 response body. 通常根据平台实现,返回 xml 或者 json 内容。

  • 万一在服务器上没有找到资源,则API 必须返回 HTTP response code 404 (NOT FOUND)

  • 如果检测到 GET 请求本身是错误的,服务器应当返回 HTTP response code 400 (BAD REQUEST)

1.2 示例URIs

HTTP GET http://www/appdomin.com/users
HTTP GET http://www/appdomin.com/users?size=20&page=5
HTTP GET http://www/appdomin.com/users/123
HTTP GET http://www/appdomin.com/users/123/address

2. HTTP POST

POST APIs 用以创建新的子级资源,例如:某个目录下的子文件,又或者某个 数据库表的新增行。

当谈及 REST。 POST 方法是用于 给某个集合资源对象 创建一个新的资源

除非 响应包含了适当的 Cache-Control或者 Expires 头字段,该METHOD 的想用是不能够被缓存的。

请注意,POST 请求,既不 安全,也不幂等。 并且 调用两次完全相同的 POST 请求将会导致产生包含除了id,其他完全相同信息的两个不同的资源。

2.1 POST API Response Codes

  • 理想情况下,如果一个资源已经在服务器上创建过了, 那么响应应该是: HTTP response code 201(Created), 且包含 1. 描述请求状态和引用新资源的实体;2.一个 Location 头。

  • 很多时候,POST 方法执行的操作可能返回了一个不能被URI 所标识的资源。 在这种情况下,也应该响应 HTTP response code 200(OK) 或者 204(No Content) 。

2.2 示例 URIs

HTTP POST http://www/appdomin.com/users
HTTP POST http://www/appdomin.com/users/123/accounts

3. HTTP PUT

PUT APIs 主要是用于 更新一个既存的资源(如果这个资源不存在,则该API也可以选择要不要创建一个新的资源)

如果这个请求 通过了一个缓存, 并且 request-uri 标识了一个或多个当前缓存的实体,那么这些条目应当被视作过时的。 PUT 方法的响应式不可缓存的

3.1 PUT API Response Codes

  • 如果已经有一个被 PUT API 创建的新资源, 那么服务必须返回 HTTP response code 201(Created) 响应。

  • 如果一个存在的资源被修改了, 那么服务器应该返回 200 (OK) 或者 204 (No Content) 响应状态码,以告知请求成功完成。

示例 URIs

HTTP PUT http://www/appdomin.com/users/123
HTTP PUT http://www/appdomin.com/users/123/accounts/456

[POST 和 PUT APIs 的区别(https://restfulapi.net/rest-put-vs-post/) 能够从请求 URIs 观察一二: POST 请求是针对资源集合

对象发出的, 而 PUT 请求则是针对单个资源。

4. HTTP DELETE

顾名思义,DELETE APIs 用于删除资源(由请求 URI 标识)。

DELETE 操作是等幂的,如果你DELETE一个资源,那么它会从资源集合中移除掉目标

有些人可能认为这使得DELETE方法是非幂等的。这是讨论和个人意见的问题。

如果这个请求 通过了一个缓存, 并且 request-uri 标识了一个或多个当前缓存的实体,那么这些条目应当被视作过时的。 DELETE 方法的响应式不可缓存的

4.1 DELETE API Response Codes

  • 如果想用包含了状态描述的实体#If the response includes an rntity describing the status,一个 DELETE 请求的成功响应,应该是 HTTP response code 200(OK)

  • 如果该操作处于等待队列中,那么应该返回 202 (Accepted) 。

  • 如果操作已经执行,但是响应无实体,那么返回状态码应该是 204 (No Content)。

  • 对同个资源重复操作 DELETE API将不会改变输出 —— 然而, 当对一个 资源执行第二次操作的时候一般会返回 404(NOT FOUND) 应为它已经被删除掉了。

4.2 示例 URIs

HTTP DELETE http://www.appdomin.com/users/123
HTTP DELETE http://www.appdomain.com/users/123/accouts/456

5. HTTP PATCH

HTTP PATCH 请求被用于对一个资源进行部分更新 #to make a partial update

如果你看到一个PUT 请求也在修改一个资源实体,那么让它更加精确 —— PATCH METHOD 就是正确的选择专用于部分更新一个既存资源。 并且。你应该仅在需要替换某个资源的时候使用 PUT 请求。

请注意,如果你决定在你的应用中使用 PATCH APIs,也有一些挑战需要注意:

浏览器,服务器,以及web应用框架对PATCH 的支持并不是统一的, IE8,PHP, Tomcat. Django 等等都对 PATCH 不支持或者缺乏支持。

PATCH 请求的 payload#载荷 并不像 PUT 请求那样简单,例如:

HTTP GET /user/1

产生如下响应:

{ "id": 1, "username": "admin", "email": "email@example.org" }

一个简单的PATCH 请求以更新email将会像下面这样:

HTTP PATCH /users/1
[{ "op": "replace", "path":"/email", "value": "new.email@example.org" }]

根据以下 HTTP 规范,可能会有以下操作:

[
{ "op": "test", "path": "/a/b/c", "value": "foo" },
{ "op": "remove", "path": "/a/b/c" },
{ "op": "add", "path": "/a/b/c", "value": [ "foo", "bar"] },
{ "op": "replace", "path": "/a/b/c", "value": 42 },
{ "op": "move", "from": "/a/b/c", "path": "/a/b/c" },
{ "op": "copy", "from": "/a/b/c", "path": "/a/b/c" },
]

PATCH Method 请不是 POST 或者 PUT Methods 的替代品,它不同于替换整个资源

6. HTTP Methods 总结

下表是上述讨论的HTTP methods 的使用总结

The below table summarises the use of HTTP methods discussed above.

HTTP Method CRUD Collection Resource (e.g. /users) Single Resouce (e.g. /users/123)
POST Create 201 (Created), ‘Location’ header with link to /users/{id} containing new ID Avoid using POST on a single resource
GET Read 200 (OK), list of users. Use pagination, sorting, and filtering to navigate big lists 200 (OK), single user. 404 (Not Found), if ID not found or invalid
PUT Update/Replace 405 (Method not allowed), unless you want to update every resource in the entire collection of resource 200 (OK) or 204 (No Content). Use 404 (Not Found), if ID is not found or invalid
PATCH Partial Update/Modify 405 (Method not allowed), unless you want to modify the collection itself 200 (OK) or 204 (No Content). Use 404 (Not Found), if ID is not found or invalid
DELETE Delete 405 (Method not allowed), unless you want to delete the whole collection — use with caution 200 (OK). 404 (Not Found), if ID not found or invalid

7.相关术语#Glossary

7.1 Safe Methods

如果 Methods 的语义化定义本质上是只读的,那么就被认为 Methods 是安全的。 客户端不会请求,也不会期望由于对目标资源应用安全方法而导致源服务器上的任何状态更改。

GET, HEAD, OPTIONS, TRACE methods 被认为是安全 methods, 就像每个 HTTP 定义的, GET 和 HEAD methods 应该仅被用于资源的获取,且不会更新/删除 服务器上的资源。

区分安全和非安全methods的目的在于,允许自动获取资源处理(如爬虫)获取数据,而不用担心造成损害。

安全methods 允许用户代理#agents 其他methods,例如 POST, PUT, DELETE. 以这种独特的方式,使用户意识到可能正在要求采取不安全操作的事实 - 他们可以在服务器上更新/删除资源,因此应仔细使用。

7.2 Idempotent Methods #幂等方法

如果一次和多次操作所造成的结果均相同,这就是幂等这个词的含义。

在HTTP 中, PUT, DELETE 以及上述的safy methods (GET, HEAD, OPTIONS, TRACE) 都是幂等操作

translate @from resuful api

REST APIs的更多相关文章

  1. (转载)构建public APIs与CORS

    from: https://segmentfault.com/a/1190000000709909 理由:在操作层面详细的讲解了跨域的操作.尤其是对于option请求的详解.收藏. 在构建Public ...

  2. ECMAScript Web APIs node.js

    https://hacks.mozilla.org/2015/04/es6-in-depth-an-introduction/ What falls under the scope of ECMASc ...

  3. 【墙内备份】Android 6.0 APIs

    Android 6.0 APIs In this documentSHOW MORE Fingerprint Authentication Confirm Credential App Linking ...

  4. swagger:The World's Most Popular Framework for APIs.

    swagger官网:http://swagger.io/ swagger ui demo:http://petstore.swagger.io 让API文档总是与API定义同步更新,是一件非常有价值的 ...

  5. [译]Node.js : Building RESTful APIs using Loopback and MySQL

    国庆后可能就要使用StrongLoop那套东西来做项目了 原文:http://www.javabeat.net/loopback-mysql/ Loopback是什么? Loopback是一个开源的N ...

  6. URLRedirector 解决网页上无法访问 google CDN 的问题(fonts、ajax、themes、apis等)

    URLRedirector 解决网页上无法访问 google CDN 的问题(fonts.ajax.themes.apis等) 由于某些原因,在访问国外的网站时有时候会特别慢,像 stackoverf ...

  7. 谷歌正式发布Google APIs Client Library for .NET

    好消息,特大好消息! 英文原文:Google API library for .NET paves the way for Google services on Windows phone 本月 17 ...

  8. POSTMAN and HTTPie to test APIs

    http://blog.mashape.com/postman-httpie-test-apis/ We love working with APIs at Mashape, and we love ...

  9. Android SDK Manager Google Apis 下载

    本意是想利用google的gcm来实装android推送功能的,很遗憾, google貌似已经停止提供啥服务给国内了,或者说国内想继续使用google 服务暂时变得几乎不可能了.找了个代理来进行goo ...

  10. Improve Scalability With New Thread Pool APIs

    Pooled Threads Improve Scalability With New Thread Pool APIs Robert Saccone Portions of this article ...

随机推荐

  1. 在java web工程中jsp页面中使用kindeditor

    在这之前我们用Notepad++写过kindeditor 在Java web工程里也差不多 首先我们复制之前的thml代码粘贴到工程里 然后把样式也复制进去 然后就可以运行了

  2. 学习saltstack (五)

    Saltstack介绍 Salt三种运行方式 1.local本地运行2.Master/Minion3.Salt ssh Salt的三大功能 a.远程执行b.配置管理(状态管理)c.云管理:阿里云,aw ...

  3. 使用 Docker, 7 个命令部署一个 Mesos 集群

    这个教程将给你展示怎样使用 Docker 容器提供一个单节点的 Mesos 集群(未来的一篇文章将展示怎样很容易的扩展这个到多个节点或者是见底部更新).这意味着你可以使用 7 个命令启动整个集群!不需 ...

  4. SpringCloud个人笔记-01-Eureka初体验

    eureka是一个高可用的组件,它没有后端缓存,每一个实例注册之后需要向注册中心发送心跳,在默认情况下erureka server也是一个eureka client ,必须要指定一个 serve &l ...

  5. 【freertos】007-系统节拍和系统延时管理实现细节

    前言 本章节的时钟系统节拍主要分析FreeRTOS内核相关及北向接口层,南向接口层不分析. 本章节的系统延时主要分析任务系统延时实现. 原文:李柱明博客:https://www.cnblogs.com ...

  6. (原创)[C#] 一步一步自定义拖拽(Drag&Drop)时的鼠标效果:(一)基本原理及基本实现

    一.前言 拖拽(Drag&Drop),属于是极其常用的基础功能. 无论是在系统上.应用上.还是在网页上,拖拽随处可见.同时拖拽时的鼠标效果也很漂亮,像这样: 这样: 还有这样: 等等等等. 这 ...

  7. Linux系统下ifconfig命令使用及结果分析

    Linux下网卡命名规律:eth0,eth1.第一块以太网卡,第二块.lo为环回接口,它的IP地址固定为127.0.0.1,掩码8位.它代表你的机器本身. 1.ifconfig是查看网卡的信息. if ...

  8. Bootstrap 之 Metronic 模板的学习之路 - (1)总览

    写在前面 bootstrap 的模板非常多,Envato 上有着各种各样的免费及付费模板.Metronic 是我最喜欢的模板之一(看一眼就喜欢上的那种),当前售价 $28 ,觉得赞的,不妨支持一下作者 ...

  9. prometheus之查询语言

    PromQL(Prometheus Query Language)是 Prometheus 自己开发的表达式语言,语言表现力很丰富,内置函数也很多.使用它可以对时序数据进行筛选和聚合. 一.PromQ ...

  10. 给大家补充一个结构体的例子:下面TwoNumber就是一个形式上的结构体

    给大家补充一个结构体的例子:下面TwoNumber就是一个形式上的结构体: class TwoNumber {     int num1;     int num2; } public class T ...