fetch POST 返回 HTTP 415,而 curl 继续正常并返回结果

IT技术 javascript reactjs curl fetch fetch-api
2021-05-11 13:39:33

这就是我的代码的样子

let body = {
            authCode: "XXXX",
            clientId: "YYYYYY",
            clientSecret: "ZZZZZZ"
        };


        fetch('https://api.myapp.com/oauth/token',{
            method: "POST",
            headers: {
                "Content-Type": "application/json",
                "Accept": "application/json"
            },
            mode: 'no-cors',
            body: body
        }).then(function(response){
            console.log("response: ", response);
        }).catch(function(error){
            console.log("could not get tokens: ", error);
        })

在 Chrome 中,这就是我所看到的 在此处输入图片说明

我试着这样做curl command,这就是它的样子

➜  ~ curl -X POST -H "Content-Type: application/json" -d '{
  "authCode": "XXXX",
  "clientId": "YYYYY",
  "clientSecret": "ZZZZZZZZ"
}' https://api.myapp.com/oauth/token
{"authToken":"e141kjhkwr3432ca9b3d2128385ad91db4cd2:cca6b151-cab4-4de2-81db-9a739a62ae88:23000000"}

我在这里做错了什么?

更新

改成follow之后,结果还是 HTTP 415

fetch('https://api.myapp.com/oauth/token',{
            method: "POST",
            headers: {
                "Content-Type": "application/json",
                "Accept": "application/json"
            },
            mode: 'no-cors',
            body: JSON.stringify(body)
        }).then(function(response){
            console.log("response: ", response);
        }).catch(function(error){
            console.log("could not get tokens: ", error);
        })

有趣的是,我意识到我发送了标头,"Content-Type": "application/json"而我返回的是content-type: text/plain,为什么会发生这种情况?

在此处输入图片说明

2个回答

fetch()不期望在 .js 处有 JavaScript 对象bodycurl命令和fetch()模式不一样。使用body: JSON.stringify(<javascript plain object>).

Request

注:该body类型只能是一个BlobBufferSourceFormDataURLSearchParamsUSVStringReadableStream类型,因此增加一个JSON对象,你需要字符串化该对象的有效载荷。

有关set as value for的实现状态,请参阅使用 ReadableStream 获取ReadableStreambody

您必须像这样定义AcceptContent-Type标题并将数据对象字符串化

const params = {
            headers: {
                'Accept': "application/json, text/plain, */*",
                'Content-Type': "application/json;charset=utf-8"
            },
            body: JSON.stringify(yourObject),
            method: "POST"
        };

fetch(url, params)
        .then(data => { console.log('data', data)})
        .then(res => { console.log('res', res) })
        .catch(error => { console.log('error', error) });