RESTful是什么?
- REST是英文representational state transfer(表象性状态转变)或者表述性状态转移。(看不懂)
- REST是一种web服务中接口设计风格。(看不懂 +1)
- 在RESTful接口设计中,用URL定位资源,用HTTP动词(GET,POST,DELETE)描述操作。
GET:读取(Read);POST:新建(Create);PUT:更新(Update);DELETE:删除(Delete)
- 看Url就知道要什么;看http method就知道干什么;看http status code就知道结果如何。
举个栗子
假如我们有个接口是关于删除图书管理系统的某本书,如果使用普通的接口设计风格,那么接口设计出来可能是:
/library/deleteBook POST
但是如果我们使用RESTful风格,设计出来的接口可能是:
/library/books DELETE
books是个名词,用来定位资源;DELETE是个动词,用来进行操作描述。
http://127.0.0.1/library/books/1 GET 根据图书id获取图书信息
http://127.0.0.1/library/books POST 新增图书
http://127.0.0.1/library/books PUT 修改图书信息
http://127.0.0.1/library/books DELETE 删除图书信息
RESTful设计原则
- 网络上的所有事物都被抽象为资源
- 每个资源都有一个唯一的资源标识符 (比如上面的图书馆里面的书我们可以抽象为book)
- 同一个资源具有多种表现形式(xml,json等)
- 对资源的各种操作不会改变资源标识符
- 所有的操作都是无状态的
- 符合REST原则的架构方式即可称为RESTful
误区
- url不应该存在动词,最好是复数,比如你要展示某篇新闻,你可以/posts/id ,但是不要/posts/show/id
- 如果真的要表示一个动作,比如A给B转账,你不要/accounts/A/transfer/B/to/2,而是因为把transfer写成名次transacion /transaction from=A&to=B&amount=2
- 不要在url中加入版本号,比如/post1/v1/transaction 而是因为把版本号作为header的参数写在header里面。
- 对于多级URL,我们要做的是确认主体,把某些url作为参数的一部分传进去;比如我们要查看某个作者的所有书,我们可能会这么写
/authors/huangzp/books
,但是比较正确的做法是先确认主体为书,然后把作者作为参数传进去,得/books?author=huangzp
状态码
分类
1xx:相关信息
2xx:操作成功
3xx:重定向
4xx:客户端错误
5xx:服务器错误
2XX
200表示操作成功,但是也有更详细的分类:
- GET/PUT 200 表示获取/更新成功
- POST 201 表示表示新增成功,已经添加了新的资源
- DELETE 204 表示删除失败,已经删除了资源
- 202 表示服务器已经接收了请求,但是还未处理,过阵子再处理,用于异步操作
3XX
- 301 永久跳转(用于浏览器)
- 302/307 暂时跳转(用于浏览器)
- 303 see other (用于api)
4XX
4xx状态码表示客户端错误,主要有下面几种。
- 400 请求地址有问题,可能是参数匹配有误等
- 401 用户未提供身份验证凭据,或者没有通过身份验证。
- 403 用户通过了身份验证,但是不具有访问资源所需的权限。
- 405 用户已经通过身份验证,但是所用的 HTTP 方法不在他的权限之内。
- 404 所请求的资源不存在,或不可用。
5XX
5xx状态码表示服务端错误。一般来说,API 不会向用户透露服务器的详细信息,所以只要两个状态码就够了。
- 500 客户端请求有效,服务器处理时发生了意外。
- 503 服务器无法处理请求,一般用于网站维护状态。