1 前言
fetch
是一种现代的前端 Web API,用于发起网络请求并处理响应。它比传统的 XMLHttpRequest
更加简洁、灵活,且基于 Promise 进行异步操作,使得代码更清晰易懂。
2 POST
post封装
async function postData(url, data) {
try {
const response = await fetch(url, {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify(data)
});
if (!response.ok) {
throw new Error(`HTTP错误:状态码 ${ response.status }`);
}
return await response.json();
} catch (error) {
console.error('请求失败:', error);
return null;
}
}
调用
document.getElementById('postBtn').addEventListener('click', async function () {
const url = "http://127.0.0.1:8090/test_json_post";
const dataToSend = {
nickname: '有勇气的牛排'
};
const data2 = await postData(url, dataToSend);
console.log(">>> 最终结果");
console.log(data2);
});
3 GET
<script>
async function getData(url, params) {
try {
const urlWithParams = new URL(url);
Object.keys(params).forEach(key => urlWithParams.searchParams.append(key, params[key]));
const response = await fetch(urlWithParams, {
method: 'GET',
headers: {'Content-Type': 'application/json'}
});
if (!response.ok) {
throw new Error(`HTTP错误:状态码 ${response.status}`);
}
return await response.json();
} catch (error) {
console.error('请求失败:', error);
return null;
}
}
document.getElementById('getBtn').addEventListener('click', async function () {
const url = "http://127.0.0.1:8090/test_json";
const params = {
nickname: '有勇气的牛排'
};
const data = await getData(url, params);
console.log(">>> 最终结果");
console.log(data);
});
</script>
4 通用函数封装
通用函数
async function requestData(url, method = 'GET', data = null) {
try {
let options = {
method: method.toUpperCase(),
headers: {'Content-Type': 'application/json'}
};
if (method === 'POST' && data) {
options.body = JSON.stringify(data);
}
if (method === 'GET' && data) {
const urlWithParams = new URL(url);
Object.keys(data).forEach(key => urlWithParams.searchParams.append(key, data[key]));
url = urlWithParams.toString();
}
const response = await fetch(url, options);
if (!response.ok) {
throw new Error(`HTTP错误:状态码 ${response.status}`);
}
return await response.json();
} catch (error) {
console.error('请求失败:', error);
return null;
}
}
POST
document.getElementById('postBtn').addEventListener('click', async function () {
const url = "http://127.0.0.1:8090/test_json_post";
const dataToSend = {
nickname: '有勇气的牛排'
};
const result = await requestData(url, 'POST', dataToSend);
console.log(">>> POST 请求结果");
console.log(result);
});
GET
document.getElementById('getBtn').addEventListener('click', async function () {
const url = "http://127.0.0.1:8090/test_json_get";
const params = {
nickname: '有勇气的牛排'
};
const result = await requestData(url, 'GET', params);
console.log(">>> GET 请求结果");
console.log(result);
});

<h2><a id="1__0"></a>1 前言</h2>
<p><code>fetch</code> 是一种现代的前端 Web API,用于发起网络请求并处理响应。它比传统的 <code>XMLHttpRequest</code> 更加简洁、灵活,且基于 Promise 进行异步操作,使得代码更清晰易懂。</p>
<h2><a id="2_POST_4"></a>2 POST</h2>
<p>post封装</p>
<pre><div class="hljs"><code class="lang-javascript"><span class="hljs-keyword">async</span> <span class="hljs-keyword">function</span> <span class="hljs-title function_">postData</span>(<span class="hljs-params">url, data</span>) {
<span class="hljs-keyword">try</span> {
<span class="hljs-keyword">const</span> response = <span class="hljs-keyword">await</span> <span class="hljs-title function_">fetch</span>(url, {
<span class="hljs-attr">method</span>: <span class="hljs-string">'POST'</span>,
<span class="hljs-attr">headers</span>: {<span class="hljs-string">'Content-Type'</span>: <span class="hljs-string">'application/json'</span>},
<span class="hljs-attr">body</span>: <span class="hljs-title class_">JSON</span>.<span class="hljs-title function_">stringify</span>(data)
});
<span class="hljs-keyword">if</span> (!response.<span class="hljs-property">ok</span>) {
<span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> <span class="hljs-title class_">Error</span>(<span class="hljs-string">`HTTP错误:状态码 <span class="hljs-subst">${ response.status }</span>`</span>);
}
<span class="hljs-keyword">return</span> <span class="hljs-keyword">await</span> response.<span class="hljs-title function_">json</span>();
} <span class="hljs-keyword">catch</span> (error) {
<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">error</span>(<span class="hljs-string">'请求失败:'</span>, error);
<span class="hljs-keyword">return</span> <span class="hljs-literal">null</span>; <span class="hljs-comment">// 根据需要返回 null 或抛出错误</span>
}
}
</code></div></pre>
<p>调用</p>
<pre><div class="hljs"><code class="lang-javascript"><span class="hljs-variable language_">document</span>.<span class="hljs-title function_">getElementById</span>(<span class="hljs-string">'postBtn'</span>).<span class="hljs-title function_">addEventListener</span>(<span class="hljs-string">'click'</span>, <span class="hljs-keyword">async</span> <span class="hljs-keyword">function</span> (<span class="hljs-params"></span>) {
<span class="hljs-keyword">const</span> url = <span class="hljs-string">"http://127.0.0.1:8090/test_json_post"</span>;
<span class="hljs-keyword">const</span> dataToSend = {
<span class="hljs-attr">nickname</span>: <span class="hljs-string">'有勇气的牛排'</span>
};
<span class="hljs-keyword">const</span> data2 = <span class="hljs-keyword">await</span> <span class="hljs-title function_">postData</span>(url, dataToSend);
<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-string">">>> 最终结果"</span>);
<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(data2);
});
</code></div></pre>
<h2><a id="3_GET_42"></a>3 GET</h2>
<pre><div class="hljs"><code class="lang-javascript"><script>
<span class="hljs-keyword">async</span> <span class="hljs-keyword">function</span> <span class="hljs-title function_">getData</span>(<span class="hljs-params">url, params</span>) {
<span class="hljs-keyword">try</span> {
<span class="hljs-comment">// 构建 URL 查询参数字符串</span>
<span class="hljs-keyword">const</span> urlWithParams = <span class="hljs-keyword">new</span> <span class="hljs-title function_">URL</span>(url);
<span class="hljs-title class_">Object</span>.<span class="hljs-title function_">keys</span>(params).<span class="hljs-title function_">forEach</span>(<span class="hljs-function"><span class="hljs-params">key</span> =></span> urlWithParams.<span class="hljs-property">searchParams</span>.<span class="hljs-title function_">append</span>(key, params[key]));
<span class="hljs-keyword">const</span> response = <span class="hljs-keyword">await</span> <span class="hljs-title function_">fetch</span>(urlWithParams, {
<span class="hljs-attr">method</span>: <span class="hljs-string">'GET'</span>,
<span class="hljs-attr">headers</span>: {<span class="hljs-string">'Content-Type'</span>: <span class="hljs-string">'application/json'</span>}
});
<span class="hljs-keyword">if</span> (!response.<span class="hljs-property">ok</span>) {
<span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> <span class="hljs-title class_">Error</span>(<span class="hljs-string">`HTTP错误:状态码 <span class="hljs-subst">${response.status}</span>`</span>);
}
<span class="hljs-keyword">return</span> <span class="hljs-keyword">await</span> response.<span class="hljs-title function_">json</span>();
} <span class="hljs-keyword">catch</span> (error) {
<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">error</span>(<span class="hljs-string">'请求失败:'</span>, error);
<span class="hljs-keyword">return</span> <span class="hljs-literal">null</span>; <span class="hljs-comment">// 根据需要返回 null 或抛出错误</span>
}
}
<span class="hljs-variable language_">document</span>.<span class="hljs-title function_">getElementById</span>(<span class="hljs-string">'getBtn'</span>).<span class="hljs-title function_">addEventListener</span>(<span class="hljs-string">'click'</span>, <span class="hljs-keyword">async</span> <span class="hljs-keyword">function</span> (<span class="hljs-params"></span>) {
<span class="hljs-keyword">const</span> url = <span class="hljs-string">"http://127.0.0.1:8090/test_json"</span>;
<span class="hljs-keyword">const</span> params = {
<span class="hljs-attr">nickname</span>: <span class="hljs-string">'有勇气的牛排'</span>
};
<span class="hljs-keyword">const</span> data = <span class="hljs-keyword">await</span> <span class="hljs-title function_">getData</span>(url, params);
<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-string">">>> 最终结果"</span>);
<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(data);
});
</script>
</code></div></pre>
<h2><a id="4__81"></a>4 通用函数封装</h2>
<p>通用函数</p>
<pre><div class="hljs"><code class="lang-javascript"><span class="hljs-comment">// 通用请求函数</span>
<span class="hljs-keyword">async</span> <span class="hljs-keyword">function</span> <span class="hljs-title function_">requestData</span>(<span class="hljs-params">url, method = <span class="hljs-string">'GET'</span>, data = <span class="hljs-literal">null</span></span>) {
<span class="hljs-keyword">try</span> {
<span class="hljs-keyword">let</span> options = {
<span class="hljs-attr">method</span>: method.<span class="hljs-title function_">toUpperCase</span>(),
<span class="hljs-attr">headers</span>: {<span class="hljs-string">'Content-Type'</span>: <span class="hljs-string">'application/json'</span>}
};
<span class="hljs-comment">// 如果是 POST 请求,添加请求体</span>
<span class="hljs-keyword">if</span> (method === <span class="hljs-string">'POST'</span> && data) {
options.<span class="hljs-property">body</span> = <span class="hljs-title class_">JSON</span>.<span class="hljs-title function_">stringify</span>(data);
}
<span class="hljs-comment">// 如果是 GET 请求,将数据作为查询参数添加到 URL 中</span>
<span class="hljs-keyword">if</span> (method === <span class="hljs-string">'GET'</span> && data) {
<span class="hljs-keyword">const</span> urlWithParams = <span class="hljs-keyword">new</span> <span class="hljs-title function_">URL</span>(url);
<span class="hljs-title class_">Object</span>.<span class="hljs-title function_">keys</span>(data).<span class="hljs-title function_">forEach</span>(<span class="hljs-function"><span class="hljs-params">key</span> =></span> urlWithParams.<span class="hljs-property">searchParams</span>.<span class="hljs-title function_">append</span>(key, data[key]));
url = urlWithParams.<span class="hljs-title function_">toString</span>();
}
<span class="hljs-keyword">const</span> response = <span class="hljs-keyword">await</span> <span class="hljs-title function_">fetch</span>(url, options);
<span class="hljs-keyword">if</span> (!response.<span class="hljs-property">ok</span>) {
<span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> <span class="hljs-title class_">Error</span>(<span class="hljs-string">`HTTP错误:状态码 <span class="hljs-subst">${response.status}</span>`</span>);
}
<span class="hljs-keyword">return</span> <span class="hljs-keyword">await</span> response.<span class="hljs-title function_">json</span>();
} <span class="hljs-keyword">catch</span> (error) {
<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">error</span>(<span class="hljs-string">'请求失败:'</span>, error);
<span class="hljs-keyword">return</span> <span class="hljs-literal">null</span>; <span class="hljs-comment">// 根据需要返回 null 或抛出错误</span>
}
}
</code></div></pre>
<p>POST</p>
<pre><div class="hljs"><code class="lang-javascript"><span class="hljs-comment">// 用于调用 POST 请求的按钮点击事件</span>
<span class="hljs-variable language_">document</span>.<span class="hljs-title function_">getElementById</span>(<span class="hljs-string">'postBtn'</span>).<span class="hljs-title function_">addEventListener</span>(<span class="hljs-string">'click'</span>, <span class="hljs-keyword">async</span> <span class="hljs-keyword">function</span> (<span class="hljs-params"></span>) {
<span class="hljs-keyword">const</span> url = <span class="hljs-string">"http://127.0.0.1:8090/test_json_post"</span>;
<span class="hljs-keyword">const</span> dataToSend = {
<span class="hljs-attr">nickname</span>: <span class="hljs-string">'有勇气的牛排'</span>
};
<span class="hljs-keyword">const</span> result = <span class="hljs-keyword">await</span> <span class="hljs-title function_">requestData</span>(url, <span class="hljs-string">'POST'</span>, dataToSend);
<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-string">">>> POST 请求结果"</span>);
<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(result);
});
</code></div></pre>
<p>GET</p>
<pre><div class="hljs"><code class="lang-javascript"><span class="hljs-comment">// 用于调用 GET 请求的按钮点击事件</span>
<span class="hljs-variable language_">document</span>.<span class="hljs-title function_">getElementById</span>(<span class="hljs-string">'getBtn'</span>).<span class="hljs-title function_">addEventListener</span>(<span class="hljs-string">'click'</span>, <span class="hljs-keyword">async</span> <span class="hljs-keyword">function</span> (<span class="hljs-params"></span>) {
<span class="hljs-keyword">const</span> url = <span class="hljs-string">"http://127.0.0.1:8090/test_json_get"</span>;
<span class="hljs-keyword">const</span> params = {
<span class="hljs-attr">nickname</span>: <span class="hljs-string">'有勇气的牛排'</span>
};
<span class="hljs-keyword">const</span> result = <span class="hljs-keyword">await</span> <span class="hljs-title function_">requestData</span>(url, <span class="hljs-string">'GET'</span>, params);
<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-string">">>> GET 请求结果"</span>);
<span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(result);
});
</code></div></pre>
<p><img src="https://static.couragesteak.com/article/910183416b5a10140baa8bed1c3ecc99.png" alt="前端 javascript fetch get请求案例" /></p>
留言