1

我在 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 ,然后通过这个单一更改成功地重播它。

4

1 回答 1

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

于 2017-01-17T20:37:59.660 回答