对 Fetch API 调用的响应 400

Response 400 for Fetch API call

我正在尝试使用 JavaScript 的 Fetch API 进行调用以生成 OAuth 令牌,但我一直收到 400 响应代码,我不确定为什么。我将密钥和机密写入控制台以验证它们的值,然后我使用 cURL 进行了相同的 API 调用(响应是我预期的)。我的语法有什么小问题吗?

    fetch('https://api.petfinder.com/v2/oauth2/token', {
        method: 'POST',
        body: 'grant_type=client_credentials&client_id=' + key + '&client_secret=' + secret
    }).then(r => { response = r.json() });

如果请求body是字符串,则Content-Type header默认设置为text/plain;charset=UTF-8。由于您要发送 urlencoded 数据,因此必须将 Content-Type header 设置为 application/x-www-form-urlencoded

fetch('https://api.petfinder.com/v2/oauth2/token', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/x-www-form-urlencoded',
  },
  body: 'grant_type=client_credentials&client_id=' + key + '&client_secret=' + secret
})

正如我在评论中提到的,您不应该从浏览器发出上述请求,因为它会暴露客户端机密。

感谢@Arun 关于添加 Content-Type 的建议,我现在得到了正确的响应。

此外,对于任何其他 JavaScript 玩宠物寻找器的新手 API,这是我用来从响应中提取令牌的链:

    fetch('https://api.petfinder.com/v2/oauth2/token', {
        method: 'POST',
        headers: {
          'Content-Type': 'application/x-www-form-urlencoded',
        },
        body: 'grant_type=client_credentials&client_id=' + key + '&client_secret=' + secret
    }).then(response => response.json().then(data => ({
        data: data,
        status: response.status})  
    ).then(function(res) {
        console.log(res.status, res.data.access_token);
    }));