3

Ruby に変換しようとしている cURL があります。

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 が返されます。Authorization やその他のヘッダーの問題ではありません。問題は --data-binary を Ruby に変換することにあると思います。

どんな助けでも感謝します。

ありがとう、エイドリアン

4

1 に答える 1

7

問題を引き起こす可能性のあることがいくつかあります。

  1. Fileで実際のオブジェクトを使用したいRestClientので、File.open;を使用します。ファイルオブジェクトを返します。
  2. リクエストに画像オブジェクトを 2 回含めています。実際の内容はあなたの質問からは明らかにされていません。たとえば、ペイロード要素とヘッダーを混在させています。RestClient.post引数を取るの署名に基づいて、url, payload, headers={}リクエストは次の 2 つの形式のいずれかを取る必要があります。

エンドポイントは名前付きパラメーターを予期していますか? その場合は、次を使用します。

手法 1:ペイロードに「upload」という名前のフィールドまたはパラメーターが含まれ、その値が画像オブジェクトに設定される

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 に答える