2

我创建了一个控制台应用程序,在其中我向 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

4

4 回答 4

3

所以看起来 Flurl 不支持开箱即用的 Gzip,让它工作需要一些按摩。首先你需要一个自定义的 Http Client 工厂:

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();
于 2017-12-18T19:13:02.140 回答
2

更新: Flurl.Http 现在默认支持自动解压,所以只要升级就可以避免这一切。


这是一个类似于已接受答案的选项,除了它适用于对 的调用api.stackexchange.com,而且它或多或少是单行的。启动时调用一次:

FlurlHttp.ConfigureClient("https://api.github.com", cli => 
    ((HttpClientHandler)cli.HttpMessageHandler).AutomaticDecompression =
        DecompressionMethods.GZip | DecompressionMethods.Deflate);

附带说明一下,Flurl 的默认值与 HttpClient 的默认值在自动解压方面完全相同。评论中有注释说 GZIP 可以与 HttpClient 一起使用,这让我摸不着头脑,但似乎 HttpClient 存在因平台/版本而异的差异。为了让事情变得更容易和更可预测,我正在考虑在 Flurl 中默认支持 GZIP/DEFLATE,但我首先需要了解性能等方面的含义。

于 2017-12-20T02:39:35.243 回答
1

Flurl.Http 2.2 刚刚发布,现在默认会自动解压 GZIP 和 DEFLATE。所以,新的最佳答案是:升级。:)

于 2018-02-22T13:44:48.030 回答
0

这是 2019 年,我找不到合适的库供 dotnet 使用 API。所以我自己创造了一个。还有很长的路要走。我打算尽可能地维护它。它已将其发布为 nuget,您可以在Github上查看源代码

来自 Nuget

Install-Package StackExchange.NET -Version 1.1.0
于 2019-09-18T09:58:58.927 回答