如何解码 Sinatra 中的路由参数?

How to decode route parameters in Sinatra?

我实现了一个简单的路由:

get '/test' do
    params
end

当我调用它时没有像

这样的编码参数
/test?plip=plop
=> ["plip", "plop"]

我可以毫无问题地检索我的参数。

但是,使用编码参数:

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

key/value 不再匹配。 我们有解决这个问题的方法吗?

提前致谢。

由于可以对查询值进行编码(如果它们包含影响解析的字符,则应该进行编码)那么应用程序接收 = 作为 %3D 的时间不应该是意味着是查询字符串的一部分,而不仅仅是查询值。 Rack 为您处理查询字符串的解析,因此您需要担心的是,在您的示例中,params["plip"]value 是否需要解码,但我认为您甚至不需要为此担心,如以下示例所示:

require 'sinatra'

get '/' do
  params.inspect
end

我通过 IRB 得到一个 CGI 编码的字符串:

URI.encode ""
=> ""

然后我 运行 应用程序并检查输出(注意,在 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%2Fwhosebug.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%2Fwhosebug.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%2Fwhosebug.com%2Fquestions%2F28987085%2Fhow-to-decode-route-parameters-in-sinatra HTTP/1.1" 200 98
- -> /?plip=https%3A%2F%2Fwhosebug.com%2Fquestions%2F28987085%2Fhow-to-decode-route-parameters-in-sinatra
{"plip"=>""}%    

从最后的输出可以看出,传入的参数已经为您解码:

{"plip"=>""}%