如何解码 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"=>""}%
我实现了一个简单的路由:
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"=>"