使用Flurl向StackExchange API发出GET请求时出现“意外的字符异常”

时间:2017-12-18 18:16:12

标签: c# stackexchange-api flurl

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

当我open it in the browser

时,URL会返回正确的JSON

4 个答案:

答案 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