我有一个像
这样的网址http://app.chat.com/avert!Callbcak.htm
要求。
我用golang
创建了请求req, _ := http.NewRequest("GET", "http://app.chat.com/avert!Callbcak.htm", nil)
fmt.Printf("%v\n", req.URL.String())
结果是
http://app.chat.com/avert%21Callbcak.htm
这不起作用,网站需要没有转义感叹号的网址。
如何正确请求该网址?
答案 0 :(得分:0)
来自http://tools.ietf.org/html/rfc3986
关于角色的第2节已被重写以解释什么
保留字符,保留字符以及为什么是字符 保留,即使它们没有被通用的分隔符用作分隔符 句法。通常不安全解码的标记字符,
包括感叹号(“!”),星号(“*”),单引号
(“'”),打开和关闭括号(“(”和“)”)已被移动
保留集以澄清之间的区别 保留,毫无保留,希望能回答最常见的问题 方案设计者的问题。同样,关于
的部分 百分比编码的字符已被重写,URI规范化器为
现在获得解码任何百分比编码八位字节的许可
这意味着!
是分隔符的不幸选择,因为虽然语法允许在segment
中使用(作为pchar
非终端的一部分),但它也是一部分reserved
非终端。
在我阅读时,RFC对于!
reservedness 略有矛盾,具体取决于使用它的上下文。
转义字符似乎是最安全的假设,因为收件人“被许可解码百分比编码的八位字节”。您应该考虑使用另一个分隔符或解码端点上的实体。
答案 1 :(得分:0)
最后我找到了答案here
我在发送之前处理请求:
func (s *Sender) regulateRequestURL(req *http.Request) {
if strings.Contains(req.URL.Path, "!") {
req.URL.Opaque = fmt.Sprintf("//%s%s", req.URL.Host, req.URL.Path)
}
}