2011-06-22 26 views
5

我有以下代碼:Ruby Net :: HTTP - 自動停止轉義引號?

http = Net::HTTP.new("www.something.com", 80) 
    http.set_debug_output($stdout) 
    http.post("/blah", "something", {'random-parameter' => 'value1="something",value2="somethingelse"'}) 

後來,當我從標準輸出讀取輸出,它看起來像這樣:

<- "POST /blah HTTP/1.1\r\nAccept: */*\r\nContent-Type: application/x-www-form-urlencoded\r\nConnection: close\r\nrandom-parameter: value1=\"something\",value2=\"somethingelse\"\r\nContent-Length: 9\r\nHost: www.something.com\r\n\r\n" 
<- "something" 

用引號被轉義。問題在於斜槓似乎被髮送到服務器,而服務器不喜歡這樣。我收到說

Unknown value for random-parameter in header: {value1=\\\"something\\\"value2=\\\"somethingelse\\\"} 

所以我的問題是錯誤的,有沒有辦法告訴的Net :: HTTP不插入的斜線,或發送頭之前帶他們出去?

澄清:

我使用Ruby 1.8.7和Rails 2.0.2。

我認爲它可能是逃避角色的Rails,但我不知道如何讓它停止。

回答

2

你確定你正在建立正確的頭? Net :: HTTP在發送請求時不會引用引號。

端子1::

> nc -v -l -p 2323 

終端2(在IRB):

> http = Net::HTTP.new("localhost", 2323) 
> http.post("/blah", "something", {'random-parameter' => ...) 

結果(在終端1):可以很容易地通過使用例如netcat的(NC)驗證它

listening on [any] 2323 ... 
connect to [127.0.0.1] from localhost [127.0.0.1] 37598 
POST /blah HTTP/1.1 
Connection: close 
Accept: */* 
Random-Parameter: value1="something",value2="somethingelse" 
Content-Type: application/x-www-form-urlencoded 
Content-Length: 9 
Host: localhost:2323 

something 

我想你實際上可能想要做的事(不知道,但我猜)是更多沿着HTTP規格:

> http.post("/blah", "something", { 
    'random-parameter' => 'value1="something"; value2="somethingelse"' }) 

Rails的可能是解釋您的第一個值1 = ...作爲整個value..when你可能需要單獨的價值觀「;」,而不是「」。

另請注意,您通常不會通過請求標頭傳遞參數。但是,也許這就是你想要在這種情況下做什麼(?)否則,你應該傳遞參數在URL本身,比如param1 = foo & param2 = bar,或者使用x-www-form-urlencoded來傳遞參數。

在這裏看到了備忘單:
http://www.rubyinside.com/nethttp-cheat-sheet-2940.html

0

是不是你的名字/值對是「隨機參數」的值的問題,因此他們需要被轉義。

我期望當你檢查控制器方法中的隨機參數值,它不會有斜槓 - 你可以調試代碼或打印參數,看看接收到什麼?