Ruby Net :: HTTP - Остановить автоматическое экранирование кавычек? - PullRequest
5 голосов
/ 22 июня 2011

У меня есть следующий код:

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

Затем, когда я читаю вывод из stdout, он выглядит так:

<- "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 ]

2 голосов
/ 01 июля 2011

Вы уверены, что правильно строите заголовок?Net :: HTTP не заключает в кавычки при отправке запроса.Вы можете легко проверить это, используя, например, netcat (nc):

Terminal 1:

> nc -v -l -p 2323

Terminal 2 (в irb):

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

Result (в терминале 1):

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 = ... как целое значение .. когда вам, вероятно, нужно разделить значения с помощью ';', а не ','.

Также обратите внимание, что вы не 'Обычно параметры передаются через заголовки запросов.Но, возможно, это то, что вы хотите сделать в этом случае (?) В противном случае вы должны либо передать параметры в самом URL-адресе, например, param1 = foo¶m2 = bar, либо использовать x-www-form-urlencoded для передачи параметров.

Смотрите здесь для шпаргалки:http://www.rubyinside.com/nethttp-cheat-sheet-2940.html

0 голосов
/ 27 июня 2011

Не проблема ли в том, что ваши пары имя / значение являются значением для "random-параметра", следовательно, их необходимо экранировать.

Я ожидаю, что при проверке значения случайного параметрав методе контроллера, что у него не будет косой черты - вы можете отладить код или распечатать параметр, чтобы увидеть, что получено?

...