我创建了一个控制台应用程序,我在其中向Stack Exchange API发出一个简单的GET请求以获取一些注释。我正在使用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
答案 0 :(得分:3)
所以似乎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();
答案 1 :(得分:1)
更新:Flurl.Http现在默认支持自动解压缩,所以只需upgrade就可以避免所有这些。
这是一个类似于已接受答案的选项,除了仅适用于api.stackexchange.com
的来电,而且它或多或少都是一行。在启动时调用一次:
FlurlHttp.ConfigureClient("https://api.github.com", cli =>
((HttpClientHandler)cli.HttpMessageHandler).AutomaticDecompression =
DecompressionMethods.GZip | DecompressionMethods.Deflate);
作为旁注,Flurl的默认值与HttpClient在自动解压缩方面的默认值完全相同。评论中有注释说GZIP与HttpClient一起工作,让我摸不着头脑,但似乎HttpClient有differences取决于平台/版本。为了使事情变得更容易和更可预测,我正在考虑默认支持Flurl中的GZIP / DEFLATE,但我首先需要了解其在性能等方面的含义。
答案 2 :(得分:1)
Flurl.Http 2.2只是released,现在它将automatically decompress GZIP and DEFLATE by default。所以,新的最佳答案是:升级。 :)
答案 3 :(得分:0)
这是2019年,我找不到适合dotnet使用API的库。所以我自己创造了一个。还有很长的路要走。我正计划尽可能地维护它。它已经以nuget的形式发布,您可以在Github
上查看源代码。来自Nuget
Install-Package StackExchange.NET -Version 1.1.0