2016-04-13 12 views
0

Ich versuche, ein von Paperclip hochgeladenes Bild an eine API zu senden.So senden Sie ein PNG-Bild mit Net :: HTTP

Wie kann ich es kodieren?

Im Moment benutze ich attachment.queued_for_write[:original].read, um den tatsächlichen Dateiinhalt dieses PNG zu erhalten, und versuche, das im Körper meiner Anfrage zu senden. Aber der Server hat es nicht.

Wenn ich die Anfrage per Postman posten, funktioniert es gut. Wie codiert Postman dies? Leider funktioniert der Versuch, den Ruby-Code von Postman zu generieren, nicht, sondern zeigt die Datei als [Object object] im Hauptteil der Anfrage an.

+0

Das hängt von Drittanbietern API erwartet Ihre Dateien. Siehe die Dokumentation für die API. [Minimales, vollständiges und überprüfbares Beispiel] (http://stackoverflow.com/help/mcve) – Uzbekjon

+0

Starten Sie Wireshark. Vergleichen Sie die POST-Anfrage von Postman mit der POST-Anfrage von Net :: HTTP. [Diese Antwort] (http://stackoverflow.com/a/30827339/5006469) kann Ihnen helfen. – rdupz

+0

@Uzbekjon Meine Frage ist, wie schreibt Postman das? Dies ist eine Rinky Dink API, deren Ersteller die Antwort auf die Frage nicht kennt. Aber es funktioniert mit Postman, daher meine Frage. – bevanb

Antwort

1

Die Postman docs say es ist Standardformular Post. A quick search Ergebnis in diesem Code:

require "net/http" 
require "uri" 

# Token used to terminate the file in the post body. Make sure it is not 
# present in the file you're uploading. 
# You might want to use `SecureRandom` class to generate this random strings 
BOUNDARY = "AaB03x" 

uri = URI.parse("http://something.com/uploads") 
file = "/path/to/your/testfile.txt" 

post_body = [] 
post_body < < "--#{BOUNDARY}\r\n" 
post_body < < "Content-Disposition: form-data; name='datafile'; filename='#{File.basename(file)}'\r\n" 
post_body < < "Content-Type: text/plain\r\n" 
post_body < < "\r\n" 
post_body < < File.read(file) 
post_body < < "\r\n--#{BOUNDARY}--\r\n" 

http = Net::HTTP.new(uri.host, uri.port) 
request = Net::HTTP::Post.new(uri.request_uri) 
request.body = post_body.join 
request["Content-Type"] = "multipart/form-data, boundary=#{BOUNDARY}" 

http.request(request) 
+0

Hier ist eine ausführlichere Lösung: https://coderwall.com/p/c-mu-a/http-posts-in-ruby – bevanb

Verwandte Themen