我有一个cURL,我试图将其翻译成Ruby。
cURL是这样的:
curl -i -k -H "Accept: application/json" -H "Authorization: token" -H "Content-Type: image/jpeg" -H "Content-Length: 44062" --data-binary "gullfoss.jpg" http://www.someurl.com/objects
我的Ruby代码就是这样:
image = File.read('uploads/images/gullfoss.jpg')
result = RestClient.post('http://www.someurl.com/objects',image,{'upload' => image, 'Accept' => 'application/json', 'Authorization' => 'token', 'Content-Type' => 'image/jpeg', 'Content-Length' => '44062'})
Ruby代码给了我一个400 Bad Request。授权或其他标题不是问题。我认为问题在于将--data-binary转换为Ruby。
任何帮助表示感谢。
谢谢, 阿德里安
答案 0 :(得分:6)
有一些事情可能导致问题。
File
对象与RestClient
一起使用,因此请使用File.open
;它返回一个文件对象。RestClient.post
的{{1}}签名,您的请求应采用以下两种形式之一:端点是否需要命名参数?如果是,请使用以下内容:
技术1:有效负载包含名为“upload”的字段或参数,值设置为图像对象
url, payload, headers={}
端点是否期望进行简单的文件上传?如果是,那么使用:
技术2:图像文件对象作为唯一有效负载发送
result = RestClient.post(
'http://www.someurl.com/objects',
{ 'upload' => image },
'Accept' => 'application/json',
'Authorization' => 'token',
'Content-Type' => 'image/jpeg',
)
请注意,我没有包含result = RestClient.post(
'http://www.someurl.com/objects',
image,
'Accept' => 'application/json',
'Authorization' => 'token',
'Content-Type' => 'image/jpeg',
)
标题;使用'Content-Length'
时通常不需要这样做,因为它在处理文件时会为您插入。
还有另一种发送有效负载的方法RestClient
解释here。
请务必仔细阅读official docs on github。
我也是RestClient
的新手,所以如果我在这种情况下错了,不要太苛刻;我会立即纠正我的任何误解。希望这有帮助!