# Restful API
>[success]`Restful API`是目前`Web API` 设计中比较流行的一种设计风格。
## Restful API
>[info]RESTful是一种软件架构风格、设计风格,而**不是**标准,只是提供了一组设计原则和约束条件。
>[danger]对于这种风格,ThinkPHP框架和laravel框架都给了很好的支持。
### 一、常用的HTTP动词
>[success]这种风格对于熟悉ThinkPHP框架的应该都比较熟悉。
~~~
* GET:读取(Read)
* POST:新建(Create)
* PUT:更新(Update)
* PATCH:更新(Update),通常是部分更新
* DELETE:删除(Delete)
~~~
>[danger]大家可能会发现,通常情况下的网络请求主要是`POST`和`GET`。通常情况下客户端是不支持除`GET`和`POST`之外的请求方式的。这里的解决方案就是:客户端发出的 HTTP 请求,要加上`X-HTTP-Method-Override`属性,来指定请求方式。
~~~http
POST /api/Person/4 HTTP/1.1
X-HTTP-Method-Override: PUT
~~~
### 二、URI与URL
#### URI
>[info]URI,统一资源标志符(Uniform Resource Identifier, URI),表示的是web上每一种可用的资源
URI通常由三部分组成:
①访问资源的命名机制;
②存放资源的主机名;
③资源自身的名称。
#### URL
>[danger]URL是URI的一个子集。
URL的格式由三部分组成:
①第一部分是协议(或称为服务方式)。
②第二部分是存有该资源的主机IP地址(有时也包括端口号)
③第三部分是主机资源的具体地址,如目录和文件名等。
### 三、端点设计
>[success]端点是指用于访问API的URI
设计原则
1. 短小便于输入的URI
2. 人可以读懂的URI
3. 没有大小写混用的URI
4. 修改方便的URI
5. 不会暴漏服务器端架构的URI
6. 规则统一的URI
例:
|目的|端点|方法|
|-|-|-|
|获取用户信息列表|http://api.yifeng.com/v1/users|GET|
|新用户注册|http://api.yifeng.com/v1/users|POST|
|获取特定用户信息|http://api.yifeng.com/v1/users/:id|GET|
|更新用户信息|http://api.yifeng.com/v1/users/:id|PUT/PATCH|
|删除用户信息|http://api.yifeng.com/v1/users/:id|DELETE|
### 四、HTTP状态码
客户端的每一次请求,服务器都必须给出回应。回应包括 HTTP 状态码和数据两部分。当然,也可以根据需求再返回一个 业务状态码。具体的规范可以自行设定。
HTTP 状态码就是一个三位数,分成五个类别。
|状态码|含义|
|-|-|
|1字头|消息|
|2字头|成功|
|3字头|重定向|
|4字头|客户端原因引起的错误|
|5字头|服务器端原因引起的错误|
主要的状态码
|状态码|名称|含义|
|-|-|-|
|200|OK|请求成功|
|201|Created|请求成功,新资源建立|
|202|Accept|请求成功|
|204|No Content|请求成功,没有内容|
|300|Multiple Choices|存在多个资源|
|301|Moved Permanently|资源被永转移|
|302|Found|请求的资源被暂时转移|
|303|See Other|引用他处|
|400|Bad Request|请求不正确|
|401|Unauthorized|需要认证|
|403|Forbidden|禁止访问|
|404|Not Found|没有找到指定的资源|
|429|Too Many Requests|访问次数过多|
|500|Internal Server Error|服务器端发生错误|
|503||服务器暂时停止运营
>[danger]关于状态码这一块大家可以到百度上去了解一下。业务状态码是咱们自行定义的!
### 五、服务器回应
>[success]一般情况下,服务器不要回复纯文本的数据,通常情况下返回的是`XML`或`JSON`格式的数据。
>[danger] Web API其实就是网页的一种,其返回的数据形式更容易让计算机程序处理,而不是返回普通的HTML。所以返回的数据应该尽可能地设计得方便计算机程序处理。
>[info]在这里就使用JOSN作为返回的数据格式。
#### 数据格式返回的指定方法
1. 使用查询参数的方法
2. 使用扩展名的方法
3. 使用在请求首部指定媒体类型的方法
>[danger]如果您的接口不需要同时支持多种类型,也可以不需要进行执定。
>[danger]在返回数据时,在满足需求的情况下,返回的数据量越小越好。(可以让用户来决定返回的数据)
#### 返回数据的封装
>[info]关于响应返回的数据格式,建义封装成统一样的格式。
### 六、版本号
>[success]关于版本号的,有多种解决方案。在这里使用ThinkPHP自带的解决方案。
### 七、API接口文档
>[success]通常情况下,API接口的开发者和使用者是不同的人群,所以做一详细的接口文档是十分必要的。