2016-04-27 8 views
2

Ich habe viel über das Senden von JSON-Daten durch Ruby-HTTP-Anfragen geforscht, im Vergleich zum Senden von Daten und Anfragen über Fiddler. Mein primäres Ziel ist es, einen Weg zu finden, einen verschachtelten Hash der Daten in einer HTTP-Anfrage mit Ruby zu senden.Kann ich mit dem Net/HTTP-Modul von Ruby rohe JSON-Daten senden?

In Fiddler können Sie einen JSON im Anfragetext angeben und den Header "Content-Type: application/json" hinzufügen.

In Ruby, mit Net/HTTP, möchte ich das gleiche tun, wenn es möglich ist. Ich habe eine Ahnung, dass es nicht möglich ist, da die einzige Möglichkeit, JSON-Daten zu einer http-Anfrage in Ruby hinzuzufügen, set_form_data ist, die Daten in einem Hash erwartet. Dies ist in den meisten Fällen in Ordnung, aber diese Funktion verarbeitet verschachtelte Hashes nicht ordnungsgemäß (siehe comments in diesem Artikel).

Irgendwelche Vorschläge?

Antwort

0

Nach oben Tadman Antwort zu lesen, ich Hinzufügen von Daten näher betrachten direkt an den Körper der HTTP-Anfrage. Am Ende habe ich genau das:

require 'uri' 
require 'json' 
require 'net/http' 

jsonbody = '{ 
      "id":50071,"name":"qatest123456","pricings":[ 
       {"id":"dsb","name":"DSB","entity_type":"Other","price":6}, 
       {"id":"tokens","name":"Tokens","entity_type":"All","price":500} 
       ] 
      }' 

# Prepare request 
url = server + "/v1/entities" 
uri = URI.parse(url) 
http = Net::HTTP.new(uri.host, uri.port) 
http.set_debug_output($stdout) 

request = Net::HTTP::Put.new(uri) 
request.body = jsonbody 
request.set_content_type("application/json") 

# Send request 
response = http.request(request) 

Wenn Sie jemals diesen Code gesendet debuggen die HTTP-Anforderung ist, verwenden, wörtlich: http.set_debug_output ($ stdout). Dies ist wahrscheinlich der einfachste Weg, um HTTP-Anfragen zu debuggen, die über Ruby gesendet werden und es ist sehr klar, was vor sich geht :)

2

Obwohl so etwas wie Faraday verwendet, ist oft viel angenehmer, es ist immer noch machbar mit dem Net :: HTTP-Bibliothek:

require 'uri' 
require 'json' 
require 'net/http' 

url = URI.parse("http://example.com/endpoint") 

http = Net::HTTP.new(url.host, url.port) 

content = { test: 'content' } 

http.post(
    url.path, 
    JSON.dump(content), 
    'Content-type' => 'application/json', 
    'Accept' => 'text/json, application/json' 
) 
+0

danke. Deine Antwort hat mir geholfen, etwas zu erreichen, das funktioniert hat. – Max

Verwandte Themen