HttpWebRequest有时会错误地解码查询参数的部分



我在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中的一个错误?

相关内容

  • 没有找到相关文章

最新更新