aboutsummaryrefslogtreecommitdiff
path: root/files/zh-cn/web/http/methods/post/index.html
blob: b4133818f1e2d853e73a408b691c3b2ae7acf664 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
---
title: POST
slug: Web/HTTP/Methods/POST
tags:
  - HTTP
  - 参考
  - 请求方法
translation_of: Web/HTTP/Methods/POST
---
<div>{{HTTPSidebar}}</div>

<p><strong>HTTP <code>POST</code> 方法</strong> 发送数据给服务器. 请求主体的类型由 {{HTTPHeader("Content-Type")}} 首部指定.</p>

<p>PUT 和{{HTTPMethod("POST")}}方法的区别是,PUT方法是幂等的:连续调用一次或者多次的效果相同(无副作用)。连续调用同一个POST可能会带来额外的影响,比如多次提交订单。</p>

<p>一个 <code>POST</code> 请求通常是通过 <a href="/en-US/docs/Web/Guide/HTML/Forms">HTML 表单</a>发送, 并返回服务器的修改结果. 在这种情况下, content type 是通过在 <dfn>{{HTMLElement("form")}} 元素中设置正确的 {{htmlattrxref("enctype", "form")}} 属性, 或是在 {{HTMLElement("input") }}{{HTMLElement("button")}} 元素中设置 {{htmlattrxref("formenctype", "input")}} 属性来选择的</dfn>:</p>

<ul>
 <li><code>application/</code><dfn><code>x-www-form-urlencoded</code>: 数据被编码成以 <code>'&amp;'</code> 分隔的键-值对, 同时以 <code>'='</code> 分隔键和值. 非字母或数字的字符会被 </dfn>{{glossary("percent-encoding")}}<dfn>: 这也就是为什么这种类型不支持二进制数据(应使用 <code>multipart/form-data</code> 代替).</dfn></li>
 <li><dfn><code>multipart/form-data</code></dfn></li>
 <li><dfn><code>text/plain</code></dfn></li>
</ul>

<p>当 POST 请求是通过除 HTML 表单之外的方式发送时, 例如使用 {{domxref("XMLHttpRequest")}}, 那么请求主体可以是任何类型.按HTTP 1.1规范中描述,POST为了以统一的方法来涵盖以下功能:</p>

<ul>
 <li>注释已有的资源</li>
 <li>在公告板,新闻组,邮件列表或类似的文章组中发布消息;</li>
 <li>通过注册新增用户;</li>
 <li>向数据处理程序提供一批数据,例如提交一个表单;</li>
 <li>通过追加操作,扩展数据库数据.</li>
</ul>

<table class="properties">
 <tbody>
  <tr>
   <th scope="row">请求是否有主体</th>
   <td></td>
  </tr>
  <tr>
   <th scope="row">成功的响应是否有主体</th>
   <td></td>
  </tr>
  <tr>
   <th scope="row">{{Glossary("安全")}}</th>
   <td></td>
  </tr>
  <tr>
   <th scope="row">{{Glossary("幂等")}}</th>
   <td></td>
  </tr>
  <tr>
   <th scope="row">{{Glossary("可缓存")}}</th>
   <td>Only if freshness information is included</td>
  </tr>
  <tr>
   <th scope="row">HTML 表单是否支持</th>
   <td></td>
  </tr>
 </tbody>
</table>

<h2 id="语法">语法</h2>

<pre class="syntaxbox">POST /index.html
</pre>

<h2 id="示例">示例</h2>

<p>使用默认的 <code>application/x-www-form-urlencoded</code> 做为 content type 的简单表单:</p>

<pre class="line-numbers  language-html">POST / HTTP/1.1
Host: foo.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 13

say=Hi&amp;to=Mom</pre>

<p>使用 <code>multipart/form-data</code> 作为 content type 的表单:</p>

<pre>POST /test.html HTTP/1.1
Host: example.org
Content-Type: multipart/form-data;boundary="boundary"

--boundary
Content-Disposition: form-data; name="field1"

value1
--boundary
Content-Disposition: form-data; name="field2"; filename="example.txt"

value2</pre>

<h2 id="规范">规范</h2>

<table class="standard-table">
 <tbody>
  <tr>
   <th scope="col">规范</th>
   <th scope="col">标题</th>
  </tr>
  <tr>
   <td>{{RFC("7231", "POST", "4.3.3")}}</td>
   <td>Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content</td>
  </tr>
 </tbody>
</table>

<h2 id="浏览器兼容性">浏览器兼容性</h2>

<p>{{Compat("http.methods.POST")}}</p>

<h2 id="另见">另见</h2>

<ul>
 <li>{{HTTPHeader("Content-Type")}}</li>
 <li>{{HTTPHeader("Content-Disposition")}}</li>
</ul>