Rails: Плюс знак GET-Request заменен пространством
В Rails 3 (Ruby 1.9.2) я отправляю запрос
Started GET "/controller/action?path=/41_+"
Но список параметров выглядит следующим образом:
{"path"=>"/41_ ",
"controller"=>"controller",
"action"=>"action"}
Что здесь происходит? Знак -
, *
или .
отлично работает, его просто +
, который будет заменен пробелом.
Ответы
Ответ 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.)