名词解释
安全性:客户端可以发起请求,并知道它不会改变资源的状态。
幂等性:保证客户端重复发起某个请求的效果与一次请求的效果一致。
方法名 | 安全性 | 幂等性 | 请求状态 | 响应状态 | 用途 |
GET | true | true | 只有header,没有body | 对应请求URI的资源表述,通常带有body。响应header中的Content-Type,Content-Length,Content-Language,Last-Modified,ETag等应该和响应body的表述一致。 | 通常用于请求服务器发送某个资源。例如获取URI对应的html,文件等。 |
HEAD | true | true | 只有header,没有body | 只有header,没有body。服务器不能添加body。 | HEAD 方法与 GET 方法的行为很类似,但服务器在响应中只返回首部。不会返回实体的主体部分。
可以在不获取到实际资源的情况下看看资源状态是否正确。 可以获取资源大小,考虑是否需要进行多线程下载等。 |
OPTIONS | true | true | 只有header,没有body | 默认只有header,但是也可以在body中添加内容,比如描述性文字 | 使用该方法来获取服务器支持的http 方法,也可以用来ping服务器是否正常。 |
POST | false | false | 一个资源的表述 | 一个资源的表述,或是一个重定向指令。如果body中存在表述,则其URI和请求URI不一致,包含一个带有改资源URI的Content-Location头。 | POST 方法起初是用来向服务器输入数据的 。实际上,通常会用它来支持 HTML 的表单。让资源在服务器上进行一系列操作并返回结果,如创建,删除,更新等。 |
PUT | false | true | 一个资源的表述。请求的body可以与客户端后续收到的GET请求一样,当然,也可以不一样。在某些情况下,服务器也可要求客户端只提供资源的可变部分。 | 更新的状态。可在响应中包含被更新资源的完整表述,但是客户端不能假设响应中包含完整状态,除非响应有一个Content-Location头。如果服务器没有包含这个头,客户端必须提交一个无条件GET请求来获取更新后的表述,带有Last-Modified和/或ETag头。 | 与 GET 从服务器读取文档相反,PUT 方法会向服务器写入文档。常用于上传文件或替换服务器上的文件。 |
DElETE | false | true | 只有header,没有body。 | 成功或失败。body中可以包含操作的状态。 | 顾名思义,DELETE 方法所做的事情就是请服务器删除请求 URL 所指定的资源。但是,客户端应用程序无法保证删除操作一定会被执行。因为 HTTP 规范允许服务器在不通知客户端的情况下撤销请求。 |
TRACE | / | / | header与body。 | body中包含整个请求消息。 | TRACE 方法主要用于诊断,回显服务器接收到的信息,可比对是否在传输过程中数据是否出现损坏或被修改。支持此方法的服务器可能存在安全漏洞。 |
各个方法报文示例
GET
[code lang=”SHELL”]
# 请求
GET /hello HTTP/1.1
Host: localhost
# 响应
HTTP/1.1 200 OK
Content-Type: application/xml; charset=UTF-8
Content-Length: 21
<hello>tester</hello>
[/code]
HEAD
[code lang=”SHELL”]
# 请求
GET /hello HTTP/1.1
Host: localhost
# 响应
HTTP/1.1 200 OK
Content-Type: application/xml; charset=UTF-8
Content-Length: 21
[/code]
OPTIONS
[code lang=”SHELL”]
# 测试对应资源所支持的方法
OPTIONS /test-options HTTP/1.1
Host: localhost
# 响应
HTTP/1.1 204 No Content
Allow: GET, POST, OPTIONS
# ping服务器
OPTIONS * HTTP/1.1
Host: localhost
# 响应
HTTP/1.1 204 No Content
[/code]
POST
[code lang=”SHELL”]
# 执行动作的请求
POST /prompt/delete HTTP/1.1
Host: localhost
# 响应
HTTP/1.1 204 No Content
# 创建资源的请求
POST /stu/bob HTTP/1.1
Host: localhost
Content-Type: application/xml
<student>
<name>Bob</name>
<age>22</age>
</student>
# 响应
HTTP/1.1 201 Created
Location: http://localhost/stu/bob
Content-Location: http://localhost/stu/bob
Content-Type: application/xml
<student>
<name>Bob</name>
<age>22</age>
</student>
# 修改资源的请求
POST /stu/bob/modify HTTP/1.1
Host: localhost
Content-Type: application/json
{
"Name": "Bob",
"Age": 24
}
# 响应
HTTP/1.1 303 See Other
Location: http://localhost/stu/bob
Content-Type: application/xml
<student>
<name>Bob</name>
<age>24</age>
</student>
[/code]
PUT
[code lang=”SHELL”]
# 更新资源的请求
PUT /stu/bob HTTP/1.1
Host: localhost
# 响应
HTTP/1.1 204 No Content
# 创建资源的请求
PUT /stu/alice HTTP/1.1
Host: localhost
# 响应
HTTP/1.1 201 Created
Location: http://localhost/stu/alice
Content-Length: 0
[/code]
DELETE
[code lang=”SHELL”]
# 请求
DELETE /doc/old.txt HTTP/1.1
Host: localhost
# 响应
HTTP/1.1 204 No Content
[/code]
TRACE
[code lang=”SHELL”]
# 请求
TRACE /trace HTTP/1.1
Host: localhost
Accept: text/html
# 响应
HTTP/1.1 200 OK
Content-Type: message/http
# 空行
TRACE /trace HTTP/1.1
Host: localhost
Accept: text/html
[/code]
关于方法名扩展
HTTP 被设计成字段可扩展的,这样新的特性就不会使老的软件失效了。扩展方法指的就是没有在 HTTP/1.1 规范中定义的方法。服务器会为它所管理的资源实现一些 HTTP 服务,这些方法为开发者提供了一种扩展这些 HTTP 服务能力的手段。