我需要使用一个服务,该服务接受一个名为&#34的GET参数; names []"。
例如:GET http://example.com/name2id?names[]=john
当我尝试使用WebClient在C#中使用它时,括号被编码为%5B%5D,服务器无法理解。当我使用我的浏览器(未编码)发送上述内容时,一切正常。
这是不起作用的例子:
using (var client = new System.Net.WebClient())
{
response = client.DownloadString(new Uri("http://example.com/name2id?names[]=john"));
}
由提琴手监视,继承人请求:
GET http://example.com/name2id?names%5B%5D=john HTTP/1.1
Host: example.com
Connection: Keep-Alive
有没有办法让框架不对URL进行编码,或者以其他方式解决这个问题?
P.S。我不控制API所以我无法改变它。
更新
这有点奇怪。我找到了一个解决方案,将我的C#代码更改为:
using (var client = new System.Net.WebClient())
{
response = client.DownloadString(new Uri("http://example.com/name2id?names[]=john", true));
}
请注意Uri中的布尔dontEscape
。它实际上已被弃用,但它有效吗?谁能解释一下呢?
答案 0 :(得分:1)
据我所知,RFC2396 []在URI中不是有效字符。因此,我认为您的服务需要格式错误的http请求。
query = *uric
uric = reserved | unreserved | escaped
unreserved = alphanum | mark
mark = "-" | "_" | "." | "!" | "~" | "*" | "'" | "(" | ")"
reserved = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" | "$" | ","
escaped = "%" hex hex
答案 1 :(得分:0)
你确定编码的字符是真正的问题吗?
WebClient类正确编码字符。如果服务无法处理正确编码的字符,则服务将中断。
如果服务以这种方式被破坏,你必须使用它,那么你必须找到一种不同的方式来发送请求。
答案 2 :(得分:0)
从技术上讲,将[]
编码为%5B%5D
是正确的,所以问题不是使用[],而是提供程序没有正确地对路径/查询字符串进行解码
答案 3 :(得分:0)
您应该只能将URI作为字符串传递
这样做
response = client.DownloadString("http://example.com/name2id?names[]=john");
无需编码网址即可使用。
虽然没试过,所以我可能错了。
答案 4 :(得分:0)
如CodeInChaos所述,根据RFC2396,URL无效。
要使C#不能转义无效字符,URI的重载方法可以使用:
new Uri("http://example.com/name2id?names[]=john", true)
但是,这种方法已被弃用,但显然它仍然有效。我必须忍受警告弹出:)