这是我的 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 响应。
如果 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。