2011-11-11 6 views
3

Ruby Je vais avoir du mal à traduire cette demande CURL en Ruby utilisant RESTClient:réusinage une demande de CURL RESTClient

system("curl --digest -u #{@user}:#{@pass} '#{@endpoint}/#{id}' --form [email protected]'#{path}' -X PUT") 

Je continue de recevoir 400 Bad Request erreurs. Pour autant que je sache, la requête est correctement authentifiée, mais raccroche à partir de la partie de téléchargement de fichier. Voici mes meilleures tentatives, qui me tous ces 400 erreurs:

resource = RestClient::Resource.new "#{@endpoint}/#{id}", @user, @pass 
#attempt 1 
resource.put :image_file => File.new(path, 'rb'), :content_type => 'image/jpg' 
#attempt 2 
resource.put File.read(path), :content_type => 'image/jpg' 
#attempt 3 
resource.put File.open(path) {|f| f.read}, :content_type => 'image/jpg' 
+0

Vous ne devez pas passer content_typa en tant qu'image/jpg car vous envoyez un formulaire codé. Je voudrais simplement essayer le mettre comme: 'resource.put: image_file => File.new (chemin, 'rb')' Voir aussi cet article de stackoverflow http://stackoverflow.com/questions/184178/ruby-how-to- post-a-file-via-http-as-multipart-form-data –

+0

supprimer le content_type ne change rien. Je pense que cela pourrait avoir à voir avec le chemin fourni. Le chemin donné est un chemin absolu qui fonctionne bien dans CURL. Comment faire pour que File.read gère un chemin absolu? – user94154

Répondre

0

Vous devez examiner les demandes pour déterminer où ils diffèrent. Vous pouvez essayer de capturer votre trafic avec wireshark ou par l'intermédiaire des demandes par ou charles.

2

dans la demande boucle que vous envoyez multipart form-data via le PUT-demande, donc par conséquent, vous devez faire la même chose dans RESTClient:

resource = RestClient::Resource.new "#{@endpoint}/#{id}", @user, @pass 
resource.put :image_file => File.new(path, 'rb'), :content_type => 'multipart/form-data', :multipart => true 
1

robustus est juste, vous pouvez également utiliser un RESTClient :: Payload :: Multipart.

Cependant, j'ai vu que vous posez cette question pour votre joyau Moodstocks (https://github.com/adelevie/moodstocks). Vous aurez un autre problème qui est que (AFAIK) RestClient ne peut pas gérer l'authentification HTTP Digest.

Vous devrez utiliser une autre bibliothèque telle que HTTParty pour cela. Vous pouvez toujours utiliser RestClient :: Payload :: Multipart pour générer la charge utile comme illustré ici: https://github.com/Moodstocks/moodstocks-api/blob/master/moodstocks-api/msapi.rb

Vous pouvez également utiliser l'une des liaisons cURL ou Rufus :: Verbs si vous le souhaitez.