我在HttpWebRequest对象中发现了一些似乎不正常的东西。
如果我运行以下程序:
var q = "кот (";
(注意,这里的"кор"是用俄语写的,显然它的意思是猫。)
var encoded = Uri.EscapeDataString(q);
var url = $"https://api.twitter.com/1.1/search/tweets.json?count=100&include_entities=true&q={encoded}";
我在url中得到以下值:
https://api.twitter.com/1.1/search/tweets.json?count=100&include_entities=true&q=%D0%BA%D0%BE%D1%82%20%28
如果我运行这个:
var r = (HttpWebRequest)WebRequest.Create(url);
r.GetResponse();
在Fiddler中,观察到上述内容实际上提出了一个请求:
https://api.twitter.com/1.1/search/tweets.json?count=100&include_entities=true&q=%D0%BA%D0%BE%D1%82%20(
请注意,(没有像我构建HttpWebRequest.时那样编码为%28
如果我使用:
q = "CAT ("
即没有俄语字符,只有拉丁语(?),我将其作为URL:
https://api.twitter.com/1.1/search/tweets.json?count=100&include_entities=true&q=CAT%20%28
这也是在Fiddler中观察到的请求。
总之,当混合拉丁字符和非拉丁字符时,(似乎没有被编码发送。
有人对如何解决这个问题有什么建议吗?
更新:这很重要,因为据我所知,这是我无法成功向Twitter进行这些API查询的原因,因为它似乎破坏了我们的OAuth1签名,我们得到:HTTP/1.1 401需要授权{"错误":〔{"代码":32,"消息":"无法验证您的身份。"}〕}
我甚至可以在Fiddler中编辑失败的请求,并在GET请求中用%28替换(,然后它用这个单一的更改成功地重播它。
这可能会有所帮助。。。Uri类的行为如下所示:
var q = "кот (";
var encoded = Uri.EscapeDataString(q);
// encoded = %D0%BA%D0%BE%D1%82%20%28
var uri = new Uri("https://api.twitter.com/1.1/search/tweets.json?count=100&include_entities=true&q=" + encoded);
// uri.AbsoluteUri = https://api.twitter.com/1.1/search/tweets.json?count=100&include_entities=true&q=%D0%BA%D0%BE%D1%82%20(
var uri2 = new Uri("https://api.twitter.com/1.1/search/tweets.json?count=100&include_entities=true&q=CAT (");
// uri2.AbsoluteUri = https://api.twitter.com/1.1/search/tweets.json?count=100&include_entities=true&q=CAT%20(
var uri3 = new Uri("https://api.twitter.com/1.1/search/tweets.json?count=100&include_entities=true&q=кот (");
// uri3.AbsoluteUri = https://api.twitter.com/1.1/search/tweets.json?count=100&include_entities=true&q=%D0%BA%D0%BE%D1%82%20(
我无法调试到。NET Framework代码,但我怀疑使用了Uri。EscapeDataString可能是不正确的WRT非拉丁字符和括号?
带有未编码括号的请求真的有效吗?如果是这样的话,我建议括号不需要编码。。。
更新:我真的认为这可能是Uri中的一个错误?