我创建了一个控制台应用程序,在该应用程序中,我向堆栈Exchange API提出了一个简单的获取请求以获取一些注释。我正在使用Flurl。此方法是从Main
private static async Task GetComments()
{
dynamic d = await "https://api.stackexchange.com/2.2/comments?page=1&pagesize=5&order=desc&min=1513468800&max=1513555200&sort=creation&site=stackoverflow"
.GetJsonAsync();
}
但是,我得到了这个错误:
{"解析值时遇到的意外字符: u001f。路径'',第0行,位置0。"}
我尝试在没有运气的情况下设置这样的标题。
dynamic d = await new Url("https://api.stackexchange.com/2.2/comments.....")
.WithHeader("Content-Encoding", "gzip")
.WithHeader("Accept-Encoding", "gzip")
.GetJsonAsync();
当我在浏览器中打开时,URL确实会返回适当的json
,因此似乎Flurl不支持GZIP开箱即用,并使其工作需要一些按摩。首先,您需要自定义HTTP客户端工厂:
public class GzipClientFactory : Flurl.Http.Configuration.IHttpClientFactory
{
public HttpMessageHandler CreateMessageHandler() => new HttpClientHandler()
{
AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate
};
public HttpClient CreateHttpClient(HttpMessageHandler handler) =>
new HttpClient(handler);
}
现在配置flurl以使用以下方式:
FlurlHttp.Configure(settings => {
settings.HttpClientFactory = new GzipClientFactory();
});
现在将支持GZIP压缩:
dynamic d = await new Url("https://api.stackexchange.com/2.2/comments.....")
.GetJsonAsync();
更新: flurl.http现在默认支持自动减压,因此只需升级即可避免所有这些。
这是一个类似于接受的答案的选项,除了它适用于api.stackexchange.com
的调用,它或多或少是单线。在启动时称其为:
FlurlHttp.ConfigureClient("https://api.github.com", cli =>
((HttpClientHandler)cli.HttpMessageHandler).AutomaticDecompression =
DecompressionMethods.GZip | DecompressionMethods.Deflate);
作为副注释,Flurl的默认值与HTTPCLIENT在自动减压方面的默认值完全相同。评论中有一些注释是,GZIP与HTTPCLIENT一起使用,这让我挠头,但是似乎使用HTTPCLEINT,根据平台/版本的不同。为了使事情变得更轻松,更可预测,我正在考虑使用Flurl默认支持GZIP/DEFLATE,但我首先需要了解性能的含义,等等。
flurl.http 2.2刚刚发布,现在它将自动解压缩GZIP并默认放气。因此,新的最佳答案是:升级。:)
这是2019年,我找不到dotnet食用API的合适库。所以我自己创造了一个。还有很长的路要走。我打算尽可能地维护它。
来自nuget
Install-Package StackExchange.NET -Version 1.1.0