RESTful简介




restful都是get请求 restful get 参数_负载均衡


上一章节我已经详细的向大家介绍了什么是RESTful,此处就不过多赘述了,详见学习笔记-RESTful简单理解。

REST有主要有两个核心精神:

1. 使用Resource来当做识别的资源,也就是使用一个URL网址来代表一个Resource

2. 同一个Resource则可以有不同的Representations格式变化。这一章的路由实作了Resource概念,而Representation则是用了respond_to方法来实作,稍候我们也会介绍如何使用。

方法介绍

RESTful主要有五大方法,大致情况如下图。


restful都是get请求 restful get 参数_restful都是get请求_02


等幂性(Idempotence)

等幂性简单点说就是一次请求和多次请求,资源的状态是一样。比如GET,不论你请求多少次,资源还是在那里。值得注意的是,DELETE ,PUT和PATCH也是等幂的,因为对同一个资源删除一次或者多次,结果是一样的,就是资源被删除了,不存在了。为什么说PUT也是等幂的?当你PUT一个新资源的时候,资源被创建,再次PUT这个URI的时候,资源还是没变。当你PUT一个存在的资源时,更新了资源,再次PUT的时候,还是更新成这个样子。在PUT更新的时候,不能做相对的更新(依赖资源现在的状态),比如每次对一个数加1,这样资源状态就会变化。应该每次更新成某个数,比如把某个数变成4,则无论多少次PUT,值都是4,这样就是等幂了。我们设计Restful的时候,GET,PATCH, PUT, DELETE一定要设计成等幂的。由于网络是不可靠的,安全性和等幂性就显得特别重要。如果一次请求,服务器收到处理以后,客户端没有收到相应,客户端会再次请求,如果没有等幂性保障,就会发生意想不到的问题。POST是不安全也不等幂的,如果两次POST相同的记录,则会产生两个资源,URI可能是这样/user/record/ 1和/user/record/2,尽管他们的内容是一摸一样的。

安全性

对该REST接口访问,不会使服务器端资源的状态发生改变。

PUT与PATCH:

在上图中,我们看不出PUT与PATCH的区别,但实际上它们是有区别的。简单的说PUT更新时需要传递记录的所有属性,而PATCH只需要传递所对应的属性即可。

例如:有用户记录

{     "user":"张三"     "age":18,     "sex":"男"}

此时,我们要张三的年龄修改为20岁,使用PUT与PATCH方法分别如下。

PUT方法

{    "user":"张三"    "age":20,    "sex":"男"}

PATCH方法

{    "age":20}

路由规范

以用户记录资源为例子: (资源应该使用复数形式)对应的API接口应该如下:

"/api/user/records/" => "record后端接口""/web/user/records/*" => "record界面""/js/user/records/*.js" => "record界面自定义js""/css/user/records/*.css" => "record界面自定义css""/image/user/records/*.*" => "record界面自定义图片资源""/font/user/records/*.*" => "record界面自定义字体资源"

对应的API接口应该如下:

get '/api/user/records' => "获取所有用户记录"post '/api/user/records' => "创建新用户记录"put '/api/user/records/:recordid' => "修改指定ID用户记录"get '/api/user/records/:recordid' => "查看ID用户记录"patch '/api/user/records/:recordid' => "更新指定ID用户记录"delete '/api/user/records/:recordid' => "删除指定ID用户记录"get '/api/user/count/records' => "根据查询条件获取用户记录数量"get '/api/user/limit/records/:pagesize/:pageno' => "根据翻页查找获取用户记录"

批量操作 在请求头部添加: X-Action

post '/api/user/records' => "批量创建新用户记录"patch '/api/user/records' => "批量更新指定用户记录"delete '/api/user/records' => "批量删除指定用户记录"

#实例:

#X-Action: bulk 代表批量操作curl -XDELETE '/api/user/records'  -H 'X-Action: bulk'-d '["id1","id2"]'#X-Action: clean 代表无条件清除curl -XDELETE '/api/user/records' -H 'X-Action: clean'

嵌套 (避免层级过深的URI)

put '/api/records/:recordid/nodes/:nodeid' => "修改指定ID用户记录的指定ID节点信息"get '/api/records/:recordid/nodes' => "查看ID用户记录关联节点信息"patch '/api/records/:recordid/nodes/:nodeid' => "更新指定ID用户记录关联节点信息"delete '/api/records/:recordid/nodes/:nodeid' => "删除指定ID用户记录关联节点信息"

对应界面地址规范

get '/html/user/records/new' => "创建新事件界面"get '/html/user/records/:id/edit' => "编辑事件界面"get '/html/user/records?page=1' => "事件列表界面"get '/html/user/records/:id' => "指定事件ID界面"

请求body规范

一般WEB前端框架中GET/DELETE请求不会携带BODY;操作时需要切记

所有请求参数以json数据格式在请求body里面提交。实例

curl -XGET "http://127.0.0.1/api/events"  -H 'Content-Type: application/json; charset=utf-8' -d '{    "page_size": 1,    "page_num": 10}'

3. 请求头部规范

需要在头部中添加 Content-Type: application/json; charset=utf-8

curl -XGET "http://127.0.0.1/api/events"-H 'Content-Type: application/json; charset=utf-8'-d '{}'

常用返回状态码

200 => "正常请求响应" => "一般响应"

201 => "创建成功请求响应" => "异步用户记录"

202 => "接受" => "异步用户记录"

204 => "资源不存在" => "删除成功返回||请求资源不存在"

301 => "跳转" => "界面跳转"

302 => "临时跳转" => "界面跳转"

400 => "异常请求" => "请求参数异常"

401 => "认证失败" => "未登录操作资源"

403 => "禁止访问" => "紧张访问资源"


restful都是get请求 restful get 参数_restful都是get请求_03


具体返回码细节

GET

· 200(OK) - 表示已在响应中发出

· 204(无内容) - 资源有空表示

· 301(Moved Permanently) - 资源的URI已被更新

· 303(See Other) - 其他(如,负载均衡)

· 304(not modified)- 资源未更改(缓存)

· 400 (bad request)- 指代坏请求(如,参数错误)

· 404 (not found)- 资源不存在

· 406 (not acceptable)- 服务端不支持所需表示

· 500 (internal server error)- 通用错误响应

· 503 (Service Unavailable)- 服务端当前无法处理请求

· POST

· 200(OK)- 如果现有资源已被更改

· 201(created)- 如果新资源被创建

· 202(accepted)- 已接受处理请求但尚未完成(异步处理)

· 301(Moved Permanently)- 资源的URI被更新

· 303(See Other)- 其他(如,负载均衡)

· 400(bad request)- 指代坏请求

· 404 (not found)- 资源不存在

· 406 (not acceptable)- 服务端不支持所需表示

· 409 (conflict)- 通用冲突

· 412 (Precondition Failed)- 前置条件失败(如执行条件更新时的冲突)

· 415 (unsupported media type)- 接受到的表示不受支持

· 500 (internal server error)- 通用错误响应

· 503 (Service Unavailable)- 服务当前无法处理请求

PUT

· 200 (OK)- 如果已存在资源被更改

· 201 (created)- 如果新资源被创建

· 301(Moved Permanently)- 资源的URI已更改

· 303 (See Other)- 其他(如,负载均衡)

· 400 (bad request)- 指代坏请求

· 404 (not found)- 资源不存在

· 406 (not acceptable)- 服务端不支持所需表示

· 409 (conflict)- 通用冲突

· 412 (Precondition Failed)- 前置条件失败(如执行条件更新时的冲突)

· 415 (unsupported media type)- 接受到的表示不受支持

· 500 (internal server error)- 通用错误响应

· 503 (Service Unavailable)- 服务当前无法处理请求

DELETE

· 200 (OK)- 资源已被删除

· 301 (Moved Permanently)- 资源的URI已更改

· 303 (See Other)- 其他,如负载均衡

· 400 (bad request)- 指代坏请求

· 404 (not found)- 资源不存在

· 409 (conflict)- 通用冲突

· 500 (internal server error)- 通用错误响应

· 503 (Service Unavailable)- 服务端当前无法处理请求