首页 > 解决方案 > 无法在 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)

标签: javascriptsafari

解决方案


推荐阅读