2014-07-23 90 views
0

我需要做的含花括號和冒號的URL的POST請求:如何發佈一個URL containting花括號和冒號

http://192.168.178.23/emoncms/input/post.json?json={power:200}&apikey=671b341330a7b1a4c20bf8ae7dd1faf1&time=12345677890 

我嘗試這樣做:

uri = URI("http://192.168.178.23/emoncms/input/post.json") 

res = Net::HTTP.post_form(uri, "json" => "{power:200}", "apikey" => "671b341330a7b1a4c20bf8ae7dd1faf1", "time" => "1234567890") 

但這個結果在:

json=%7BPVCurrent%3A3.0%7D&apikey=671b341330a7b1a4c20bf8ae7dd1faf1&time=1406144643 

我打電話的服務不能解析這個字符串。我如何強制紅寶石不編碼這些值?

+0

如果你正在做一個post請求,應該將JSON放在body中而不是查詢參數中嗎? –

+1

網址不能包含大括號或冒號。這不僅是紅寶石的事情,這是如何工作的網址。另外,如上所述,使用POST動詞時,您不會使用url發送參數,只需將它們發送給請求主體。在我看來,你想發送json請求,而不是http請求。 – BroiSatse

+0

對於舒爾來說,這是將valuas作爲身體的一部分發布的最好方式 - 但我所說的API並沒有這樣做,所以我必須將這個json放在URI中。 – PascalTurbo

回答

0

URL查詢值必須進行編碼,但您不會以正確的方式進行。使用設計用來處理URI的一類:

require 'uri' 

url = URI.parse('http://192.168.178.23/emoncms/input/post.json') 
url.query = URI::encode_www_form(
    { 
    'json' => '{power:200}', 
    'apikey' => '671b341330a7b1a4c20bf8ae7dd1faf1', 
    'time' => 12345677890 
    } 
) 

url.to_s # => "http://192.168.178.23/emoncms/input/post.json?json=%7Bpower%3A200%7D&apikey=671b341330a7b1a4c20bf8ae7dd1faf1&time=12345677890" 

兩個Ruby的內置URIAddressable::URI設計與URI來工作。在這兩者中,Addressable :: URI是功能更完備。

URI::encode_www_form基本上將散列視爲其內容是來自表單的值,並將它們編碼爲URL查詢。 url.query =然後將其附加到url