Подтвердить что ты не робот

Rails: Плюс знак GET-Request заменен пространством

В Rails 3 (Ruby 1.9.2) я отправляю запрос

 Started GET "/controller/action?path=/41_+"

Но список параметров выглядит следующим образом:

 {"path"=>"/41_ ",
   "controller"=>"controller",
   "action"=>"action"}

Что здесь происходит? Знак -, * или . отлично работает, его просто +, который будет заменен пробелом.

4b9b3361

Ответ 1

Эта нормальная кодировка URL, знак плюса является сокращением пространства:

В строке запроса знак плюса зарезервирован как сокращенное обозначение пробела. Следовательно, символы реального плюса должны быть закодированы. Этот метод использовался для упрощения передачи URI запросов в системах, которые не допускали пробелов.

И из стандарта HTML5:

Символ - символ пробела U + 0020
Замените символ символом символа U + 002B PLUS SIGN (+).

Ответ 2

Для POST-запросов (в случае, если некоторые из вас наткнулись на этот вопрос, например я), можно столкнуться с этой проблемой, потому что некорректно закодированы данные на стороне клиента, Кодирование данных как application/x-www-form-urlencoded будет показывать рельсы для декодирования данных, поскольку он декодирует URL-адрес и, следовательно, заменяет + знаки пробелом, в соответствии со стандартом RFC1738 как объяснено @mu слишком коротко

Решение состоит в том, чтобы кодировать данные на стороне клиента как multipart/form-data.

В PHP, используя cURL, это делается с учетом следующих результатов:

Передача массива в CURLOPT_POSTFIELDS будет кодировать данные как multipart/form-data, в то время как передача строки с кодировкой URL будет кодироваться данные как application/x-www-form-urlencoded. http://php.net/manual/en/function.curl-setopt.php

Вы можете задаться вопросом, почему я использовал PHP на стороне клиента (это потому, что клиент в моем примере был другим веб-сервером, так как я работаю над подключением API.)