我正在尝试使用 JavaScript Fetch API 向 API 发送 POST 请求。在 Chrome、FF、IE 11(使用 polyfill)中一切正常,但在 Microsoft Edge 中不起作用(控制台和网络选项卡为空)。仅当我发送拉丁文本作为参数时它才有效。例如,当我运行此代码时:
fetch(API_URL, {
method: 'POST',
body: JSON.stringify({ str: '테스트'})
})
.then((data) => console.log(data))
.catch((err) => {
console.error('fetch error:', error);
throw error;
});
它没有做任何事情,但是当我将“str”的值更改为“一些拉丁文本”时,它工作正常(向 API 发送正确的请求并接收响应)。
Microsoft 网站上的问题:请求正文中包含 unicode 字符的 fetch() 失败并出现 TypeMismatchError
在内部,JavaScript 字符串被编码为 UTF-16。看起来 Edge 默认情况下不会转换为另一种编码,如果它认为您的身体与配置的(或假设的?)
TypeMismatchError
不兼容,则会抛出 Content-type
。
解决此问题的方法是转义负载的 JSON 表示中的所有非 ASCII 字符:
function encodePayload(payload) {
return JSON.stringify(payload).
replace(/[\u007F-\uFFFF]/g, function (c) {
return "\\u" + ("0000" + c.charCodeAt(0).toString(16)).substr(-4);
});
}
fetch(API_URL, {
method: 'POST',
body: encodePayload({ str: '테스트'})
})