1

我正在尝试发布带有 time_zone 的 url,但我面临以下问题

在我的方法中,我有:

base_url = "..."
time_zone = "Alaska" # works
#time_zone = "Pacific Time (US & Canada)" # doesn't work
#time_zone = "Pacific%20Time%20(US%20%26%20Canada)" # doesn't work either 
#time_zone = "Pacific Time" # doesn't work
@url = "#{base_url}?time_zone=#{time_zone}"
@url = URI.encode(@url)
... # connect here

time_zones 的可用选择在这里http://developer.pagerduty.com/documentation/rest/types#timezone

如果我提供例如“阿拉斯加”,我会得到数据,但我需要“太平洋时间(美国和加拿大)”,但它不起作用。

我尝试使用http://meyerweb.com/eric/tools/dencoder/对我的 URL 进行编码,但它也不起作用。

还有什么我不注意的吗?

编辑:“太平洋时间”也不起作用

4

2 回答 2

0

它应该只是:

time_zone = "Pacific%20Time"

编辑:

问题是使用

URI.encode(url)

你想要的是 URI.encode_www_form:

require 'uri'

url = "http://www.example.com/time_zone=Pacific Time (US & Canada)&count=10"
p URI.encode url

query_string = URI.encode_www_form(
  [
    ["time_zone", "Pacific Time (US & Canada)"],
    ["count", 10]
  ]
)
p query_string

--output:--
"http://www.example.com/time_zone=Pacific%20Time%20(US%20&%20Canada)"
"time_zone=Pacific+Time+%28US+%26+Canada%29&count=10"

“美国和加拿大”部分中的 & 符号显然需要转义,但 URI.encode 无法做到这一点。我真的很惊讶有人会选择一个中间带有 & 符号的时区名称。你确定“太平洋时间”不会单独工作吗?例如,

"http://www.example.com/time_zone=Pacific%20Time"

或者

"http://www.example.com/time_zone=Pacific+Time"

请注意, URI.encode_www_form 实现了 www.w3.org 规范:

http://www.w3.org/TR/html5/forms.html#url-encoded-form-data

警告:

这种形式的数据集编码在许多方面都是异常的怪物,是多年实施事故和妥协的结果,导致了互操作性所需的一组要求,但绝不代表良好的设计实践。特别提醒读者要密切注意涉及字符编码和字节序列之间重复(在某些情况下是嵌套)转换的扭曲细节。

于 2013-08-20T21:39:35.247 回答
0

问题是使用

"URI.encode(url)"

这有效:

base_url = "..."
time_zone = "Pacific%20Time%20(US%20%26%20Canada)" 
@url = "#{base_url}?time_zone=#{time_zone}"
# @url = URI.encode(@url) # this made it not work!
 ... # connect here
于 2013-08-20T22:28:57.943 回答