Ruby - 使用RestClient帖子上传文件

Adr*_*ian 3 ruby curl rest-client

我有一个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
Run Code Online (Sandbox Code Playgroud)

我的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'})
Run Code Online (Sandbox Code Playgroud)

Ruby代码给了我一个400 Bad Request.授权或其他标题不是问题.我认为问题在于将--data-binary转换为Ruby.

任何帮助赞赏.

谢谢,阿德里安

Ste*_*ner 7

有一些事情可能会导致问题.

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

端点是否期望命名参数?如果是,请使用以下内容:

技术1:有效负载包括名为"upload"的字段或参数,并将值设置为图像对象

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

端点是否期望进行简单的文件上传?如果是,那么使用:

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

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

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

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

请务必仔细阅读github上官方文档.

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