REST API
是什么
REST(representational state transfer) 表现层状态转换。
是浏览器与服务器通信方式的一种架构风格。
- Resource 资源
- Representation 表现层
- State Transfer 状态转换
基于 REST 的服务被称为 RESTful 服务。
REST 不依赖于任何协议,但是几乎每个 RESTful 服务使用 HTTP 作为底层协议。
目的
服务的目的是提供一个窗口给客户端以便客户端能访问这些资源。服务架构师和开发人员想要这些服务变得易于实现、维护、扩展、伸缩。RESTful 架构具备这些。
核心概念
- 互联网上所有可访问的内容,都是资源(图片,视频文件,网页...)
- 服务器保存资源,客户端请求资源,客户端和服务器之间,传递这种资源的某种表现层;
- 同一个资源,有多种表现形式
- 协议本身不带有状态,通信时客户端必须通过参数,表示请求不同状态的资源
- 状态转换通过HTTP动词表示,客户端通过四个HTTP动词,对服务器端资源进行操作,实现"表现层状态转化"。
HTTP动词
操作 |
SQL方法 |
HTTP动词 |
CREATE |
INSERT |
POST |
READ |
SELECT |
GET |
UPDATE |
UPDATE |
PUT/PATCH |
DELETE |
DELETE |
DELETE |
状态码
200 OK - [GET]:服务器成功返回用户请求的数据,该操作是幂等的(Idempotent)。
201 CREATED - [POST/PUT/PATCH]:用户新建或修改数据成功。
202 Accepted - [*]:表示一个请求已经进入后台排队(异步任务)
204 NO CONTENT - [DELETE]:用户删除数据成功。
400 INVALID REQUEST - [POST/PUT/PATCH]:用户发出的请求有错误,服务器没有进行新建或修改数据的操作,该操作是幂等的。
401 Unauthorized - [*]:表示用户没有权限(令牌、用户名、密码错误)。
403 Forbidden - [*] 表示用户得到授权(与401错误相对),但是访问是被禁止的。
404 NOT FOUND - [*]:用户发出的请求针对的是不存在的记录,服务器没有进行操作,该操作是幂等的。
406 Not Acceptable - [GET]:用户请求的格式不可得(比如用户请求JSON格式,但是只有XML格式)。
410 Gone -[GET]:用户请求的资源被永久删除,且不会再得到的。
422 Unprocesable entity - [POST/PUT/PATCH] 当创建一个对象时,发生一个验证错误。
500 INTERNAL SERVER ERROR - [*]:服务器发生错误,用户将无法判断发出的请求是否成功。
返回结果
GET /collection:返回资源对象的列表(数组)
GET /collection/resource:返回单个资源对象
POST /collection:返回新生成的资源对象
PUT /collection/resource:返回完整的资源对象
PATCH /collection/resource:返回完整的资源对象
DELETE /collection/resource:返回一个空文档
优劣
优:
- 跨平台,管你是
Java
,还是PHP
,还是Node.js
还是Go
,你都得支持HTTP
请求。我API
平台只需要提供这个语言的SDK
,保证能按照消息协议调用就好。 - 将复杂的内部业务系统抽象为通用调用请求。包装了复杂的业务逻辑,对外提供统一的,好管理的接口。并可以定制化设计,计费,授权一类的容易管理。
劣:
- 协议描述能力弱化,
Restful
的URI
无法完全对请求参数做强格式校验。最后的方法参数绑定,模拟内部请求时往往容易出问题,尤其是以Java等强格式语言的系统。不能像WebService
一样清晰描述请求报文。 - 同样的道理,响应结果为了是
JSON
、XML
。这当中,编码,正反序列化,等操作,往往就会有性能瓶颈。而且,Java在这块资源消耗极大。以Github的ROP
这个框架为例,当年测试时,它在并发请求过高的时候就会有一个内存泄漏问题。
相关
json-server
用来为前端模拟Rest API的。
Install
1
|
$ npm install -g json-server |
Example
创建一个db.json
1
2
3
4
5
6
7
8
9
|
{ "posts" : [ { "id" : 1, "title" : "json-server" , "author" : "typicode" } ], "comments" : [ { "id" : 1, "body" : "some comment" , "postId" : 1 } ], "profile" : { "name" : "typicode" } } |
开启json server
1
|
$ json-server --watch db.json |
然后打开http://localhost:3000/posts/1,你会看到
1
|
{ "id" : 1, "title" : "json-server" , "author" : "typicode" } |
demo: rest-api-demo.zip
postman
chrome插件,一个 HTTP 通信测试工具,模拟请求的。可以模拟GET, POST, PUT, DELETE, 等等的各种请求。(测试上面那个demo的时候可以用它模拟请求)
可到官网 GetPostman.com 下载独立安装包;也可以参考这篇文章www.cnblogs.com/mafly/p/postman.html,下载 Chrome 浏览器的插件。