【问题标题】:POST request errors out when CURL works当 CURL 工作时 POST 请求错误
【发布时间】:2020-02-26 08:19:16
【问题描述】:

我正在尝试使用 cloudflare worker(粘贴在下面)通过 Twilio API 发送 SMS 消息。 CURL 请求(也粘贴在下面)我让工人离开工作。

根据工作人员的 400 错误,消息正文未正确传递 {"code": 21602, "message": "Message body is required.", "more_info": "https://www.twilio.com/docs/errors/21602", "status": 400}

但代码对我来说看起来不错。我们至少可以确认标头已正确传递,因为弄乱授权值会更改错误。

我还查看了模板库中的示例 POST 请求,但看不到失败的原因。 https://developers.cloudflare.com/workers/templates/pages/post_json/

我需要在工作人员代码中进行哪些更改才能使 POST 请求正常工作?

注意:我知道我不应该将 Twilio Auth 令牌放在正文中,但我稍后会轮换密钥。

async function handleRequest(request) {
  const init = {
    body: JSON.stringify(body),
    method: 'POST',
    headers: {
      'content-type': 'application/json',
      'Authorization': "Basic " + btoa('[account id]:[Authtoken]'),
    },
  }

  return await fetch(url, init)
}

addEventListener('fetch', event => {
  return event.respondWith(handleRequest(event.request))
})

const url = 'https://api.twilio.com/2010-04-01/Accounts/[Account id]/Messages.json'
const body = {
  Body:"Hello World",
  From:"+[some number]",
  To:"+[some number]]",
}
curl 'https://api.twilio.com/2010-04-01/Accounts/[Account id]/Messages.json' -X POST \
--data-urlencode 'To=+[some number]' \
--data-urlencode 'From=+[some number]' \
--data-urlencode 'Body=Hello World' \
-u [account id]:[auth token]

【问题讨论】:

  • 您发布的 cURL 命令实际上并未发送 JSON。它以application/x-www-form-urlencoded 格式发送数据。但是您的 Worker 脚本正在发送 JSON,所以我认为它们发送的请求并不完全相同。您的 Worker 代码肯定会发送带有正文的 HTTP POST ——您可以尝试将 URL 设置为 httpbin.org/post 以查看正在发送的内容。我不确定为什么 Twilio API 会给出错误。要尝试的一件事可能是将 JSON 字段名称小写;我认为它们不应该大写。但是当我自己尝试时,它似乎没有帮助。
  • new FormData()’ with the formData.append(k,v)` 方法提交,并删除标题中的内容类型。使用'content-type': 'application/x-www-form-urlencoded' 将其全部格式化为一个长字符串也可以。谢谢!
  • 太酷了!虽然我认为它应该也适用于 JSON,但我很困惑为什么它不适用。哦,好吧,如果它有效,它就有效。

标签: twilio cloudflare twilio-api cloudflare-workers twilio-javascript


【解决方案1】:

因为 Twilio 需要 application/x-www-form-urlencoded

REST API: Your Request

创建或更新资源涉及执行 HTTP PUT 或 HTTP POST 到资源 URI。在 PUT 或 POST 中,您代表 您希望以 urlencoded 形式更新的对象的属性 键/值对。别担心,这已经是浏览器编码的方式了 默认为 POST。但请务必将 HTTP Content-Type 标头设置为 “application/x-www-form-urlencoded” 满足您的要求,如果您是 编写自己的客户端。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多