Ruby 的其余客户端没有复制我的 CURL 请求,我不知道我在做什么不同

问题描述 投票:0回答:1

这是我的 CURL 请求:

curl  -X POST -u apikey:secret 'https://numbers.api.sinch.com/v1/projects/{project ID}/availableNumbers:rentAny' \
  -d '{
    "regionCode": "US",
    "type": "LOCAL",
    "numberPattern": {
      "pattern": "206",
      "searchPattern": "START"
    },
    "smsConfiguration": {
      "servicePlanId": "{service plan ID}"
    }
  }'

我收到了 200 回复,一切都按预期进行。

这就是我正在用 Ruby 做的事情

rest-client
:

opts = {
  :method=>:post,
  :payload=>{"smsConfiguration"=>{"servicePlanId"=>"service plan ID"}, "numberPattern"=>{"pattern"=>"206", "searchPattern"=>"START"}, "regionCode"=>"US", "type"=>"LOCAL"},
  :url=>"https://numbers.api.sinch.com/v1/projects/{project ID}/availableNumbers:rentAny",
  :headers=>{},
  :user=>"API key",
  :password=>"secret"
}

begin
  RestClient::Request.execute(opts)
rescue RestClient::BadRequest => e
  puts e.response.body
end

这将返回 400 响应。声明打印:

"{\"error\":{\"code\":400,\"message\":\"invalid character 's' looking for beginning of value\",\"status\":\"INVALID_ARGUMENT\",\"details\":[]}}\n"

我期望我的

rest-client
使用与我的 CURL 请求相同的数据得到 200 响应。

ruby rest http rest-client sinch
1个回答
0
投票

如果 API 期望请求正文中包含 JSON 文档,则需要告诉 RestClient,否则,它将生成内容类型为

application/x-www-form-urlencoded
和表单编码正文的 POST 请求。

在你的 body 上使用

to_json
对其进行编码,并添加
headers: { content_type: :json }
告诉 RestClient 发出 JSON 请求。

RestClient::Request.execute(
  method: :post,
  payload: { "smsConfiguration" => { ... } }.to_json,
  headers: { 
    content_type: :json,
  },
  # ...
)

请注意,在您的第一个示例中,在 CURL 请求中包含

Content-Type
Accept
标头会更正确,但在未设置这些标头的情况下,API 似乎可能采用 JSON .

但是,RestClient 无法做出这种假设,您需要明确告诉它您打算发送 JSON。

© www.soinside.com 2019 - 2024. All rights reserved.