【发布时间】:2016-10-05 07:39:33
【问题描述】:
我第一次使用fetch-api 并且在将非字符串化的JSON 对象传递给服务器时遇到了麻烦。
基本上我想实现与此相同的行为:
$.post(url, {"test": "test"}, function(response) {
console.log(response);
});
fetch 方法正在与对我来说无法访问的 Web API 进行通信,并且需要一个普通的 JSON 对象。
通常我只会使用FormData 将数据传递给服务器,但是JSON 将被转换为字符串[Object object]:
fetch(url, {
method: 'POST',
body: {"test": "test"}
})
.then(data => data.json())
.then(json => console.log(json))
.catch(e => console.error(e));
使用$_POST(这是API 正在使用的)时,正文请求似乎为空,但使用file_get_contents('php://input) 时给出了正确的值。
虽然这与为请求提供的错误 header 有关。所以我尝试添加标题 Ajax 帖子使用:content-type:multipart/form-data;。但是,这也没有任何价值。
我想知道这是否明确有意不使用普通的 JSON 对象作为数据提供,或者我只是遗漏了什么?
这确实有效,但不允许,因为它是 JSON 对象的字符串化版本:
var formData = new FormData();
formData.append('data', JSON.stringify(data));
fetch(url, {
method: 'POST',
body: formData
})
.then(data => data.json())
.then(json => console.log(json))
.catch(e => console.error(e));
【问题讨论】:
-
您是否尝试过简单的
body: JSON.stringify(data),因为 JSON 无论如何都只是一个字符串值。这不是真正的object本身 -
@CodingIntrigue 似乎当我不使用
formData时,它不适用于$_POST。这就是为什么我认为fetch-api在使用formData对象时会自动设置标题,但我不知道是哪个。 -
呃,你的
$.postsn-p 也不发送JSON? -
@Bergi 你的意思是
{test: 'test'}应该变成{"test": "test"}?更新:P -
@nkmol:不,我的意思是
$.post默认发送内容类型为application/x-www-form-urlencoded的请求。您的对象通过$.param发送成为“test=test”,而不是通过JSON.stringify发送成为“{"test":"test"}”。
标签: ecmascript-6 es6-promise form-data fetch-api