# http的方法

根据 HTTP 标准，HTTP 请求可以使用多种请求方法。

HTTP1.0 定义了三种请求方法： GET, POST 和 HEAD方法。

HTTP1.1 新增了六种请求方法：OPTIONS、PUT、PATCH、DELETE、TRACE 和 CONNECT 方法。

| 序号 | 方法      | 描述                                                                      |
| -- | ------- | ----------------------------------------------------------------------- |
| 1  | GET     | 请求指定的页面信息，并返回实体主体。                                                      |
| 2  | HEAD    | 类似于 GET 请求，只不过返回的响应中没有具体的内容，用于获取报头                                      |
| 3  | POST    | 向指定资源提交数据进行处理请求（例如提交表单或者上传文件）。数据被包含在请求体中。POST 请求可能会导致新的资源的建立和/或已有资源的修改。 |
| 4  | PUT     | 从客户端向服务器传送的数据取代指定的文档的内容。                                                |
| 5  | DELETE  | 请求服务器删除指定的页面。                                                           |
| 6  | CONNECT | HTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器。                                       |
| 7  | OPTIONS | 获取目的资源所支持的通信选项                                                          |
| 8  | TRACE   | 回显服务器收到的请求，主要用于测试或诊断。                                                   |
| 9  | PATCH   | 是对 PUT 方法的补充，用来对已知资源进行局部更新 。                                            |

### PUT和POST都是给服务器发送新增资源，有什么区别？

PUT 和POST方法的区别是,PUT方法是幂等的：连续调用一次或者多次的效果相同（无副作用），而POST方法是非幂等的。

举个例子，我们在开发一个博客系统，当我们要创建一篇文章的时候往往用`POST https://www.jianshu.com/articles`，这个请求的语义是，在articles的资源集合下创建一篇新的文章，如果我们多次提交这个请求会创建多个文章，这是非幂等的。

而`PUT https://www.jianshu.com/articles/820357430`的语义是更新对应文章下的资源（比如修改作者名称等），这个URI指向的就是单一资源，而且是幂等的，比如你把『刘德华』修改成『蔡徐坤』，提交多少次都是修改成『蔡徐坤』

{% hint style="info" %}
『POST表示创建资源，PUT表示更新资源』这种说法是错误的，两个都能创建资源，根本区别就在于幂等性
{% endhint %}

## options方法

**HTTP 的 `OPTIONS 方法`** 用于获取目的资源所支持的通信选&#x9879;**。**

可以使用 OPTIONS 方法对服务器发起请求，以检测服务器支持哪些 HTTP 方法：

```
curl -X OPTIONS http://example.org -i
```

响应报文包含一个 [`Allow`](https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Allow) 首部字段，该字段的值表明了服务器支持的所有 HTTP 方法：

```
HTTP/1.1 200 OK
Allow: OPTIONS, GET, HEAD, POST
Cache-Control: max-age=604800
Date: Thu, 13 Oct 2016 11:45:00 GMT
Expires: Thu, 20 Oct 2016 11:45:00 GMT
Server: EOS (lax004/2813)
x-ec-custom-error: 1
Content-Length: 0
```

#### CORS 中的预检请求 <a href="#cors-zhong-de-yu-jian-qing-qiu" id="cors-zhong-de-yu-jian-qing-qiu"></a>

在 [CORS](https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Access_control_CORS) 中，可以使用 OPTIONS 方法发起一个预检请求，以检测实际请求是否可以被服务器所接受。
