我在 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 Authorization Required {"errors ":[{"code":32,"message":"无法验证您的身份。"}]}
我什至可以在 Fiddler 中编辑失败的请求,并在 GET 请求中将 ( 替换为 %28 ,然后通过这个单一更改成功地重播它。