2015-03-11 2 views
2

я реализовал простой маршрут:Как декодировать параметры маршрута в Синатре?

get '/test' do 
    params 
end 

Когда я называю это без закодированных параметров, как

/test?plip=plop 
=> ["plip", "plop"] 

Я могу получить свой параметр без каких-либо проблем.

Однако, с закодированными параметрами:

/test?plip%3Dplop 
=> ["plip=plop", nil] 

ключ/значение не совпадает больше. У нас есть решение проблемы?

Благодарим вас заблаговременно.

+0

почему вы их кодирующим? – iain

+0

На самом деле, мне не нужно их кодировать, но на всякий случай я получаю закодированные параметры. – M07

ответ

1

Поскольку значения запроса могут быть закодированы (и должны, если они содержат символы, которые влияют на синтаксический анализ), тогда не должно быть времени, когда приложение получает = в качестве %3D, которое должно быть частью строки запроса и а не просто значение запроса. Rack обрабатывает разбор строк запроса для вас, поэтому все, о чем вам нужно беспокоиться, заключается в том, нужно ли в вашем примере присвоить значение из params["plip"], но я не думаю, что вам даже нужно беспокоиться об этом, так как следующий пример показывает:

require 'sinatra' 

get '/' do 
    params.inspect 
end 

Я получаю CGI закодированной строки с помощью IRB:

URI.encode "https://stackoverflow.com/questions/28987085/how-to-decode-route-parameters-in-sinatra" 
=> "https://stackoverflow.com/questions/28987085/how-to-decode-route-parameters-in-sinatra" 

, а затем я запустить приложение и проверьте вывод (обратите внимание, есть некоторые дополнительные символы улетучиваться в curl вызовов для моего терминала они удаляются, когда curl выполняются так игнорировать те):

$ curl http://localhost:4567/ 
127.0.0.1 - - [14/Mar/2015:12:10:03 +0900] "GET/HTTP/1.1" 200 2 0.0045 
localhost - - [14/Mar/2015:12:10:03 JST] "GET/HTTP/1.1" 200 2 
- ->/
{}% 

$ curl http://localhost:4567/\?plip\=plop 
127.0.0.1 - - [14/Mar/2015:12:10:25 +0900] "GET /?plip=plop HTTP/1.1" 200 16 0.0005 
localhost - - [14/Mar/2015:12:10:25 JST] "GET /?plip=plop HTTP/1.1" 200 16 
- -> /?plip=plop 

$ curl http://localhost:4567/\?plip\=https%3A%2F%2Fstackoverflow.com%2Fquestions%2F28987085%2Fhow-to-decode-route-parameters-in-sinatra 
127.0.0.1 - - [14/Mar/2015:12:11:51 +0900] "GET /?plip=https%3A%2F%2Fstackoverflow.com%2Fquestions%2F28987085%2Fhow-to-decode-route-parameters-in-sinatra HTTP/1.1" 200 98 0.0005 
localhost - - [14/Mar/2015:12:11:51 JST] "GET /?plip=https%3A%2F%2Fstackoverflow.com%2Fquestions%2F28987085%2Fhow-to-decode-route-parameters-in-sinatra HTTP/1.1" 200 98 
- -> /?plip=https%3A%2F%2Fstackoverflow.com%2Fquestions%2F28987085%2Fhow-to-decode-route-parameters-in-sinatra 
{"plip"=>"https://stackoverflow.com/questions/28987085/how-to-decode-route-parameters-in-sinatra"}%  

Как вы можете видеть из конечной продукции, входящий параметр был декодируются для вас:

{"plip"=>"https://stackoverflow.com/questions/28987085/how-to-decode-route-parameters-in-sinatra"}%

+0

Я думаю, что ты прав. «=» Не следует кодировать. В этом случае у меня больше нет проблем. :) Спасибо за вашу помощь. – M07

+0

@ M07 рад помочь. – iain

Смежные вопросы