aboutsummaryrefslogtreecommitdiff
path: root/files/zh-cn/web/api/xmlhttprequest/send/index.html
blob: 6b96c92ebd2c149d765c6186644cd8a16c29815d (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
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
---
title: XMLHttpRequest.send()
slug: Web/API/XMLHttpRequest/send
tags:
  - AJAX
  - API
  - HTTP request
  - Method
  - XHR
  - XMLHttpRequest
  - send
translation_of: Web/API/XMLHttpRequest/send
---
<p>{{APIRef('XMLHttpRequest')}}</p>

<p><code><strong>XMLHttpRequest.send()</strong></code> 方法用于发送 HTTP 请求。如果是异步请求(默认为异步请求),则此方法会在请求发送后立即返回;如果是同步请求,则此方法直到响应到达后才会返回。<font face="Consolas, Liberation Mono, Courier, monospace">XMLHttpRequest.send() 方法接受一个可选的参数,其作为请求主体;如果请求方法是 GET 或者 HEAD,则应将请求主体设置为 null。</font></p>

<p>如果没有使用 {{domxref("XMLHttpRequest.setRequestHeader", "setRequestHeader()")}} 方法设置 {{HTTPHeader("Accept")}} 头部信息,则会发送带有 <code>"* / *"</code>{{HTTPHeader("Accept")}} 头部。</p>

<div class="note">
<p><strong>Note:</strong> 请注意不要使用一个简单的AarryBuffer对象作为参数,ArrayBuffer已经不再是ajax规范的一部分,请改用ArrayBufferView(有关信息请参考兼容性列表。)</p>
</div>

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

<pre class="notranslate"><var>XMLHttpRequest</var>.send(<var>body</var>)</pre>

<h3 id="参数">参数</h3>

<dl>
 <dt><code>body</code> {{optional_inline}}</dt>
 <dd>在XHR请求中要发送的数据体. 可以是:
 <ul>
  <li>可以为 {{domxref("Document")}}, 在这种情况下,它在发送之前被序列化.</li>
  <li>为 <code>XMLHttpRequestBodyInit</code>, 从 <a href="https://fetch.spec.whatwg.org/#typedefdef-xmlhttprequestbodyinit">per the Fetch spec</a> (规范中)可以是 {{domxref("Blob")}}, {{domxref("BufferSource")}}, {{domxref("FormData")}}, {{domxref("URLSearchParams")}}, 或者 {{domxref("USVString")}} 对象.</li>
  <li><code>null</code></li>
 </ul>
 如果body没有指定值,则默认值为 <code>null</code> .</dd>
 <dt>
 <h3 id="返回值">返回值</h3>

 <p><code>undefined</code>.</p>

 <h3 id="例外"> 例外</h3>

 <table>
  <thead>
   <tr>
    <th scope="col">Exception</th>
    <th scope="col">Description</th>
   </tr>
  </thead>
  <tbody>
   <tr>
    <td><code>InvalidStateError</code></td>
    <td><code>send()</code> has already been invoked for the request, and/or the request is complete.</td>
   </tr>
   <tr>
    <td><code>NetworkError</code></td>
    <td>The resource type to be fetched is a Blob, and the method is not <code>GET</code>.</td>
   </tr>
  </tbody>
 </table>
 </dt>
</dl>

<pre class="syntaxbox notranslate">XMLHttpRequest.send();
XMLHttpRequest.send(ArrayBuffer <var>data</var>);
XMLHttpRequest.send(ArrayBufferView <var>data</var>);
XMLHttpRequest.send(Blob <var>data</var>);
XMLHttpRequest.send(Document <var>data</var>);
XMLHttpRequest.send(DOMString? <var>data</var>);
XMLHttpRequest.send(FormData <var>data</var>);
</pre>

<p>如果发送的数据是Document对象,需要在发送之前将其序列化。当发送一个Document对象时,Firefox 3之前的版本都是使用utf-8编码发送请求的;FireFox 3则使用由<code>body.xmlEncoding</code>指定的编码格式正确的发送文档,但如果未指定编码格式,则使用utf-8编码格式发送。</p>

<p>如果是一个nsIInputStream接口,它必须与nsIUploadChannel的setUploadStream()方法兼容。在这种情况下,将 Content-Length的头部添加到请求中,它的值则使用nsIInputStream接口的available()方法获取。任何报头包括在数据流顶部的都会被当做报文主体。所以,应该在发送请求即调用send()方法之前使用<a class="internal" href="#setRequestHeader()"><code>setRequestHeader()</code></a> 方法设置 Content-Type头部来指定数据流的MIME类型。</p>

<p>发送二进制内容的最佳方法(如上传文件)是使用一个与send()方法结合的 <a href="/en-US/docs/Web/API/ArrayBufferView">ArrayBufferView</a> 或者<a href="/en-US/docs/Web/API/Blob">Blobs</a></p>

<h2 id="案例_GET">案例: GET</h2>

<pre class="notranslate"><code>var xhr = new XMLHttpRequest();
xhr.open('GET', '/server', true);

xhr.onload = function () {
   // 请求结束后,在此处写处理代码
};

xhr.send(null);
// xhr.send('string');
</code>// <code>xhr.send(new Blob());
// xhr.send(new Int8Array());
// xhr.send({ form: 'data' });
// xhr.send(document);</code>
</pre>

<h2 id="案例_POST">案例: POST</h2>

<pre class="notranslate"><code>var xhr = new XMLHttpRequest();
xhr.open("POST", '/server', true);

//发送合适的请求头信息
xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");

xhr.onload = function () {
    // 请求结束后,在此处写处理代码
};
xhr.send("foo=bar&amp;lorem=ipsum");
// xhr.send('string');
</code>// <code>xhr.send(new Blob());
// xhr.send(new Int8Array());
// xhr.send({ form: 'data' });
// xhr.send(document);</code>
</pre>

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

<table class="standard-table">
 <tbody>
  <tr>
   <th scope="col">规范</th>
   <th scope="col">状态</th>
   <th scope="col">注解</th>
  </tr>
  <tr>
   <td>{{SpecName('XMLHttpRequest', '#the-send()-method', 'send()')}}</td>
   <td>{{Spec2('XMLHttpRequest')}}</td>
   <td>WHATWG living standard</td>
  </tr>
 </tbody>
</table>

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

<div>{{CompatibilityTable}}</div>

<div id="compat-desktop">
<table class="compat-table">
 <tbody>
  <tr>
   <th>特点</th>
   <th>Chrome</th>
   <th>Firefox (Gecko)</th>
   <th>Internet Explorer</th>
   <th>Opera</th>
   <th>Safari (WebKit)</th>
  </tr>
  <tr>
   <td>基本支持</td>
   <td>{{CompatChrome(1)}}</td>
   <td>{{CompatGeckoDesktop("1.0")}}</td>
   <td>{{CompatIe('5')}}<sup>[2]</sup><br>
    {{CompatIe('7')}}</td>
   <td>{{CompatVersionUnknown}}</td>
   <td>{{CompatSafari('1.2')}}</td>
  </tr>
  <tr>
   <td><code>send(ArrayBuffer)</code></td>
   <td>{{CompatChrome(9)}}</td>
   <td>{{CompatGeckoDesktop("9.0")}}<sup>[1]</sup></td>
   <td>{{CompatIe('10')}}</td>
   <td>{{CompatOpera('11.60')}}</td>
   <td>{{compatUnknown}}</td>
  </tr>
  <tr>
   <td><code>send(ArrayBufferView)</code></td>
   <td>{{CompatChrome(22)}}</td>
   <td>{{CompatGeckoDesktop("20.0")}}</td>
   <td>{{compatUnknown}}</td>
   <td>{{compatUnknown}}</td>
   <td>{{compatUnknown}}</td>
  </tr>
  <tr>
   <td><code>send(Blob)</code></td>
   <td>{{CompatChrome(7)}}</td>
   <td>{{CompatGeckoDesktop("1.9.2")}}</td>
   <td>{{CompatIe('10')}}</td>
   <td>{{CompatOpera('12')}}</td>
   <td>{{compatUnknown}}</td>
  </tr>
  <tr>
   <td><code>send(FormData)</code></td>
   <td>{{CompatChrome(6)}}</td>
   <td>{{CompatGeckoDesktop("2.0")}}</td>
   <td>{{CompatIe('10')}}</td>
   <td>{{CompatOpera('12')}}</td>
   <td>{{compatUnknown}}</td>
  </tr>
 </tbody>
</table>
</div>

<div id="compat-mobile">
<table class="compat-table">
 <tbody>
  <tr>
   <th>特点</th>
   <th>Android</th>
   <th>Chrome for Android</th>
   <th>Firefox Mobile (Gecko)</th>
   <th>IE Mobile</th>
   <th>Opera Mobile</th>
   <th>Safari Mobile</th>
  </tr>
  <tr>
   <td>基本支持</td>
   <td>{{CompatUnknown}}</td>
   <td>1.0</td>
   <td>{{CompatVersionUnknown}}</td>
   <td>{{CompatUnknown}}</td>
   <td>{{CompatUnknown}}</td>
   <td>{{CompatUnknown}}</td>
  </tr>
  <tr>
   <td><code>send(ArrayBuffer)</code></td>
   <td>{{CompatUnknown}}</td>
   <td>{{CompatUnknown}}</td>
   <td>{{CompatUnknown}}</td>
   <td>{{CompatUnknown}}</td>
   <td>{{compatUnknown}}</td>
  </tr>
  <tr>
   <td><code>send(ArrayBufferView)</code></td>
   <td>{{CompatUnknown}}</td>
   <td>{{CompatUnknown}}</td>
   <td>{{CompatUnknown}}</td>
   <td>{{CompatUnknown}}</td>
   <td>{{compatUnknown}}</td>
  </tr>
  <tr>
   <td><code>send(Blob)</code></td>
   <td>{{CompatUnknown}}</td>
   <td>{{CompatUnknown}}</td>
   <td>{{CompatUnknown}}</td>
   <td>{{CompatUnknown}}</td>
   <td>{{compatUnknown}}</td>
  </tr>
  <tr>
   <td><code>send(FormData)</code></td>
   <td>{{CompatUnknown}}</td>
   <td>{{CompatUnknown}}</td>
   <td>{{CompatUnknown}}</td>
   <td>{{CompatUnknown}}</td>
   <td>{{compatUnknown}}</td>
  </tr>
 </tbody>
</table>
</div>

<p>[1] 发送一个简单的<code><a href="/en-US/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer">ArrayBuffer</a></code>对象已不再是ajax规范一部分,也已经被弃用了。请使用 已被加入Gecko 20.0 {{geckoRelease("20.0")}}<a href="/en-US/docs/Web/API/ArrayBufferView"><code>ArrayBufferView</code></a></p>

<p>[2] 由于 Internet Explorer 7实现了标准的XMLHttpRequest,此功能通过ActiveXObject()实现。</p>

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

<ul>
 <li><a href="https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/Using_XMLHttpRequest">Using XMLHttpRequest</a></li>
 <li><a href="/zh-CN/docs/Web/API/XMLHttpRequest/HTML_in_XMLHttpRequest">HTML in XMLHttpRequest</a></li>
</ul>