首页 > 解决方案 > 尽管在 Postman 工作,但出现 400 错误,可能的原因是什么?

问题描述

我正在使用 Deepl API,当我在 Postman 中运行请求时它是成功的,但是在我的应用程序中使用它时它只返回一个 400 错误,我认为这意味着标头设置不正确,但这就是如何它在我的邮递员中。谁能指出这里可能存在什么问题?

async translateMessage(data = {}) {
  const url = "https://api.deepl.com/v2/translate?auth_key=myAuthKey";
  const response = await fetch(url, {
    method: "POST",
    headers: {
      'Content-Type': 'application/x-www-form-urlencoded',
      'Accept': '*/*'
    },
    body: {
      text: JSON.stringify(this.text),
      target_lang: 'DE',
      source_lang: 'EN'
    }
  });
  return response.json();
},

来自文档的示例 HTTP 发布请求:

POST /v2/translate?auth_key=[yourAuthKey]> HTTP/1.0
Host: api.deepl.com
User-Agent: YourApp
Accept: */*
Content-Length: [length]
Content-Type: application/x-www-form-urlencoded

auth_key=[yourAuthKey]&text=Hello, world&source_lang=EN&target_lang=DE

标签: javascriptvue.jsvuejs2

解决方案


bodyURL 编码消息(具有内容类型)的属性application/x-www-form-urlencoded必须是查询参数的字符串或URLSearchParams实例。

解决方案

  1. 将键/值对的对象传递给URLSearchParams构造函数。
  2. 您也可以向其中添加auth_key(必需的查询参数之一),然后将其从 URL 中删除。
  3. JSON.stringify()从属性中删除,text因为这会在翻译中插入不必要的引号。
const url = 'https://api.deepl.com/v2/translate';
const response = await fetch(url, {
  method: 'POST',
  headers: {
    'Content-Type': 'application/x-www-form-urlencoded',
    'Accept': '*/*'
  },            1️⃣
  body: new URLSearchParams({
    auth_key: myAuthKey, 2️⃣
    text: this.text, 3️⃣
    target_lang: 'DE',
    source_lang: 'EN'
  })
});

推荐阅读