XMLHttpRequest (傳統 XHR 物件、Axios 的瀏覽器端底層實作) - daniel-qa/Vue GitHub Wiki
/* 采用原生Xhr来发送HTTP请求 避免携带token访问blob报错 */
getFile(url, type) {
return new Promise((resolve, reject) => {
var xhr = new XMLHttpRequest();
var formData = new FormData();
xhr.open('get', url); //url填写后台的接口地址,如果是post,在formData append参数(参考原文地址)
if (type) xhr.responseType = 'arraybuffer';
xhr.onload = function (e) {
switch (e.currentTarget.status) {
case 200:
resolve(e.currentTarget.response)
break;
case 404:
// Message.error('有资源丢失')
reject(404)
break;
case 403:
Message.error(app.$t('http.error403'))
reject(403)
break;
default:
break;
}
};
xhr.send(formData);
})
},
responseType = 'arraybuffer' 是讓瀏覽器用二進位資料格式接收檔案內容,而不是把檔案內容轉成文字。
XMLHttpRequest (傳統 XHR 物件、Axios 的瀏覽器端底層實作)
XMLHttpRequest (XHR)
1 . 瀏覽器原生 HTTP 通訊 API
-
使用 JavaScript 發送 HTTP Request,取得 Server Response。
-
Axios / Fetch 都是在它之上的封裝概念。
2 . 支援資料與檔案處理
可處理:
JSON / Text
Blob(PDF、圖片、Excel)
ArrayBuffer(二進位資料)
3 .常見使用情境
檔案上傳 / 下載
需要控制 Header、ResponseType
避免 axios 全域設定(例如 Token interceptor)影響下載流程
- 範例
const xhr = new XMLHttpRequest();
// 設定 GET 請求
xhr.open('GET', '/api/user');
// 接收回應
xhr.onload = function () {
if (xhr.status === 200) {
console.log(xhr.responseText);
}
};
// 發送請求
xhr.send();
流程
建立 XMLHttpRequest
↓
open() 設定 API
↓
send() 發送請求
↓
onload 取得結果