JS 中的网络请求 AJAX, Fetch, WebSocket

论坛 期权论坛     
选择匿名的用户   2021-6-2 15:49   105   0
<div class="article-content">
<p>AJAX 是 Asynchronous JavaScript And XML 的简称,它可以让页面在不刷新的情况下从服务器获取数据。</p>
<h2 class="heading">XMLHttpRequest</h2>
<p>浏览器使用<code>XMLHttpRequest</code>对象于服务器通信,它可以使用JSON,XML,HTML和text等格式发送和接收数据。</p>
<p>低版本 IE 浏览器没有<code>XMLHttpRequest</code>对象,但是它可以使用<code>ActiveXObject</code>对象代替。</p>
<pre class="blockcode"><code class="hljs javascript copyable"><span class="hljs-keyword">if</span> (<span class="hljs-built_in">window</span>.XMLHttpRequest) { <span class="hljs-comment">// IE7&#43;</span>
    XHR &#61; <span class="hljs-keyword">new</span> XMLHttpRequest();
} <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (<span class="hljs-built_in">window</span>.ActiveXObject) { <span class="hljs-comment">// IE 6</span>
    XHR &#61; <span class="hljs-keyword">new</span> ActiveXObject(<span class="hljs-string">&#34;Microsoft.XMLHTTP&#34;</span>);
}
<span class="copy-code-btn">复制代码</span></code></pre>
<p>创建 XHR 实例过后就可以监听该实例的状态改变事件<code>onreadystatechange</code>,它会在 XHR 实例的<code>readyState</code>的值改变时触发回调函数。</p>
<pre class="blockcode"><code class="hljs javascript copyable">XHR.onreadystatechange &#61; <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params"></span>) </span>{ }
<span class="copy-code-btn">复制代码</span></code></pre>
<p>然后我们就可以使用<code>open</code>方法初始化一个请求和<code>send</code>方法发送 HTTP 请求。</p>
<pre class="blockcode"><code class="hljs javascript copyable">XHR.open(<span class="hljs-string">&#39;GET&#39;</span>, <span class="hljs-string">&#39;http://q.com&#39;</span>)

<span class="hljs-comment">// open 方法一共有 5 个参数,method, url, async, user, password 后三个可选。</span>
<span class="hljs-comment">// async 表示这次是否异步请求,默认是 true</span>

XHR.send()
<span class="hljs-comment">// send 方法接受一个可选参数 请求主体。</span>
<span class="hljs-comment">// 参数可以是 FormData, FormData, ArrayBuffer, Document, 序列化字符串</span>
<span class="copy-code-btn">复制代码</span></code></pre>
<p>如果是<code>post</code>方法,就要在<code>send</code>之前设置请求头的<code>Content-Type</code>。</p>
<pre class="blockcode"><code class="hljs javascript copyable">httpRequest.setRequestHeader(<span class="hljs-string">&#39;Content-Type&#39;</span>, <span class="hljs-string">&#39;application/x-www-form-urlencoded&#39;</span>)

<span class="hljs-comment">// 它接受两个参数 header 和 value</span>
<span class="copy-code-btn">复制代码</span></code></pre>
<p>然后我们就要处理服务器返回的数据,回到<code>onreadystatechange</code>函数。它监听<code>readyState</code>属性的变化,而它一共有 5 个值。</p>
<ol><li><code>0</code> 表示 请求还未初始化,尚未调用 open() 方法。</li><li><code>1</code> 表示 已建立服务器链接,open() 方法已经被调用。</li><li><code>2</code> 表示 请求已接受,send() 方法已经被调用,并且头部和状态已经可获得。</li><li><code>3</code> 表示 正在处理请求,下载中; responseText 属性已经包含部分数据。</li><li><code>4</code> 表示 完成,下载操作已完成。</li></ol>
<p>我们还需要关心<code>status</code>属性它也是只读属性,它是这次响应中的 HTTP 数字状态码。在请求之前和 XMLHttpRequest 出错时它为<code>0</code>。</p>
<p><code>responseText</code> 属性是实际的数据,它是字符串,如果相应是 JSON 格式,需要用 JSON 的 parse 处理。</p>
<pre class="blockcode"><code class="hljs javascript copyable">XHR.onreadystatechange &#61; <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params"></span>) </span>{
    <span class="hljs-keyword">if</span> (XHR.readyState &#61;&#61;&#61; <span class="hljs-number">4</span> &amp;&amp; XHR.status &#61;&#61;&#61; <span class="hljs-number">200</span>) {
        <span class="hljs-built_in">console</span>.log(<span class="hljs-built_in">JSON</span>.parse(XHR.responseText))
    }
}
<span class="copy-code-btn">复制代码</span></code></pre>
<p>如果服务器返回的是 XML, 我们可以用<code>responseXML</code>属性获得数据。</p>
<pre class="blockcode"><code class="hljs javascript copyable"><span class="hljs-comment">// 如果已指明,responseType 必须是空字符串或 &#34;docuemnt&#34; </span>
XHR.responseType &#61; <span class="hljs-string">&#39;document&#39;</span>;

<span class="hljs-comment">// overrideMimeType() 用来强制解析 response 为 XML</span>
XHR.overrideMimeType(<span class="hljs-string">&#39;text/xml&#39;</span>);

<span class="hljs-comment">// --------------</span>

<span class="hljs-keyword">var</span> root &#61; XHR.responseXML.getElementsByTagName(<span class="hljs-string">&#39;root&#39;</span>).item(<span class="hljs-number">0</span>)
<span class="copy-code-btn">复制代码</span></code></pre>
<p><code
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP