javascript - 无法在 Safari 中使用 text()、json()、arrayBuffer() 等请求函数
问题描述
使用以下示例在 Safari 控制台中创建新的 POST 请求时,
var request = new Request('/', {
method: 'POST',
body: '{ "foo": "1", "bar": 2 }'
});
request.json().then(function(json) {
console.log(json.foo);
console.log(json.bar);
});
但是,在我的应用程序中,当我尝试访问 request.text() 时,出现一个错误,指出“NotSupportedError:不支持该操作”,我不确定是什么导致了这种情况发生。
function sendRequest(input,requestInit){
// create request object for POST request
var request = new Request(input.url, requestInit);
// trying to read the clone body will throw the above error
Var requestclone = request.clone().text().then(text=>console.log(text)).catch(err=>console.log(err));
fetch(request).then(response=>{
//do stuff here
});
当使用 GET 或 PUT 请求运行相同的函数时, .text() 函数有效,我没有遇到任何问题。不支持的错误仅发生在 POST 请求上。
任何见解将不胜感激。
编辑1:
当 body 键是 formData 对象时,在 Safari 和 Chrome 中运行以下示例会产生不同的结果。
var formDataObj = new FormData();
formDataObj.append('key','value')
var requestOptions = {
cache: "default",
credentials: "same-origin",
method: "POST",
mode: "cors"
}
var requestOptionsString = {
body: "text",
cache: "default",
credentials: "same-origin",
method: "POST",
mode: "cors"
}
var requestOptionsJSON = {
body: {"key":"value"},
cache: "default",
credentials: "same-origin",
method: "POST",
mode: "cors"
}
var requestOptionsFD = {
body: formDataObj,
cache: "default",
credentials: "same-origin",
method: "POST",
mode: "cors"
}
function requestTest(input,options){
var request = new Request(input,options)
request.clone().formData().then(formData=>console.log("formData",input,formData)).catch(err=>console.log("noFormData",input,err))
request.clone().json().then(json=>console.log("json",input,JSON.stringify(json))).catch(err=>console.log("noJson",input,err))
request.clone().text().then(text=>console.log("text",input,text)).catch(err=>console.log("noText",input,err))
request.clone().arrayBuffer().then(arrayBuffer=>console.log("arrayBuffer",input,arrayBuffer)).catch(err=>console.log("noArrayBuffer",input,err))
request.clone().blob().then(blob=>console.log("blob",input,blob)).catch(err=>console.log("noBlob",input,err))
fetch(request).then(response=>console.log("response",input,response)).catch(error=>console.log("error",input,error))
}
requestTest('none',requestOptions)
requestTest('string',requestOptionsString)
requestTest('json',requestOptionsJSON)
requestTest('formData',requestOptionsFD)
解决方案
推荐阅读
- x86 - BIN 引导扇区是否可以与 GNU-Only ELF 引导加载程序兼容?
- javascript - 我的 Javascript 代码有什么问题?它不会运行
- qt - QTreeWidget takeChild() - Qt
- javascript - 为什么流不理解“导出默认值”
- amazon-web-services - Amazon S3 递归复制失败
- go - Golang amazon s3 视频上传给出奇怪的错误
- image - SVG 路径:图案填充在 Firefox 和 Safari 中不起作用
- sql - Google Sheet SQL WHERE CLAUSE 语法
- python - 计算给定整数列表在另一个中的出现总数
- java - 字节数组到字符串返回 null