3

我有一个 cURL,我正在尝试将其翻译成 Ruby。

卷曲是这样的:

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。

任何帮助表示赞赏。

谢谢,阿德里安

4

1 回答 1

7

有几件事可能会导致问题。

  1. 你想使用一个实际的File对象RestClient,所以使用File.open; 它返回一个文件对象。
  2. 您在请求中包含两次图像对象;您的问题并未明确说明实际内容。例如,您正在将有效负载元素与标头混合。根据RestClient.post带有 arguments的签名url, payload, headers={},您的请求应采用以下两种形式之一:

端点是否需要命名参数?如果是这样,请使用以下内容:

技术 1:有效载荷包含一个名为“上传”的字段或参数,并将值设置为图像对象

result = RestClient.post(
  'http://www.someurl.com/objects',
  { 'upload' => image },
  'Accept' => 'application/json',
  'Authorization' => 'token',
  'Content-Type' => 'image/jpeg',
)

端点是否需要简单的文件上传?如果是这样,那么使用:

技术 2:图像文件对象作为唯一的有效载荷发送

result = RestClient.post(
  'http://www.someurl.com/objects',
  image,
  'Accept' => 'application/json',
  'Authorization' => 'token',
  'Content-Type' => 'image/jpeg',
)

请注意,我没有包含'Content-Length'标题;使用时通常不需要这样做,RestClient因为它会在处理文件时为您插入。

还有另一种发送有效载荷的方法,这里RestClient有解释。

请务必阅读github 上的官方文档

我也是新手,RestClient所以如果我在这种情况下错了,请不要太苛刻;我会立即纠正我的任何误解。希望这可以帮助!

于 2014-03-04T07:04:58.427 回答