如何在Flurl v3.0.0中自动记录响应

3

我在集成测试中使用Flurl,并尝试配置客户端以记录响应(使用Flurl.Http 3.0.0)。

我正在使用事件处理程序将响应读取为字符串,然后将其记录。但是,如果调用代码在启用日志记录时使用IFlurlResponse.GetJsonAsync<>,反序列化的对象将为null(我想是因为流已经被读取过了)。

我认为这可能是可能的,因为我可以看到Flurl内部跟踪响应流是否已被读取(使用_streamRead_capturedBody成员)。

这是一个可重现的示例,使用Flurl.Http 3.0.0

   class Program
    {
        static async Task Main(string[] args)
        {
            using (var client = new FlurlClient("https://jsonplaceholder.typicode.com/"))
            {
                var post = await client
                            .Request("posts/1")
                            .ConfigureRequest(settings => settings.AfterCallAsync = LogResponse)
                            .GetJsonAsync<Post>();
                Console.WriteLine($"Is null with logging enabled: {post is null}"); // prints True

                post = await client.Request("posts/1").GetJsonAsync<Post>();
                Console.WriteLine($"Is null with logging disabled: {post is null}"); // prints False
            }
        }

        private static async Task LogResponse(FlurlCall call)
        {
            var responseString = await call.Response.GetStringAsync();
            Console.WriteLine(responseString);
        }
    }

    public class Post
    {
        public int Id { get; set; }
        public int UserId { get; set; }
        public string Title { get; set; }
        public string Body { get; set; }
    }

输出:

{
  "userId": 1,
  "id": 1,
  "title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit",
  "body": "quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nreprehenderit molestiae ut ut quas totam\nnostrum rerum est autem sunt rem eveniet architecto"
}
Is null with logging enabled: True
Is null with logging disabled: False

如果我将调用代码从使用GetJsonAsync<>更改为GetStringAsync并自己处理json反序列化,那么响应可以被“读取”两次,但这样会更加冗长。


你能(最少)展示一下事件处理器中正在发生的事情吗? - Todd Menier
我不确定我理解这个问题,我以为我正在展示LogResponse中的实现?还是你在问其他的东西? - shack05
噢,抱歉,我在提问时可能有点疲倦了。不知道怎么会错过那个问题。 - Todd Menier
1个回答

1

更新修复程序发布


您说得对,在大多数情况下,Flurl会“捕获”反序列化响应,以便可以轻松地多次读取。但是,正如您可能已经得出结论的那样,只有在反序列化为相同类型时才起作用。如果事件处理程序和主逻辑都反序列化为string或两者都反序列化为Post,则应该可以正常工作。
我不确定是否应该称之为错误(也许?),但我确信在这里使其按照您的期望工作将是一个不错的增强,而且并不太难。请打开issue,我将考虑在未来的版本中完成此操作。

1
谢谢Todd,我已经打开了问题571 - shack05

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接