我发现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授权 {“errors”:[{“code”:32,“message”:“无法对您进行身份验证。”}}}
我甚至可以在Fiddler中编辑失败的请求并替换(在GET请求中使用%28,然后成功使用此单个更改重播它。
答案 0 :(得分:0)
这可能会有所帮助......看来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中的一个错误?