如何使用 Flurl v3.0.0 自动记录响应
How to automatically log responses using Flurl v3.0.0
我在集成测试中使用 Flurl 并尝试配置客户端以记录响应(使用 Flurl.Http 3.0.0)。
我正在使用 event handlers 以字符串形式读取响应,然后记录它。
但是,如果调用代码在启用日志记录时使用 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 反序列化,那么响应可能是 'read' 两次,但更冗长。
我在集成测试中使用 Flurl 并尝试配置客户端以记录响应(使用 Flurl.Http 3.0.0)。
我正在使用 event handlers 以字符串形式读取响应,然后记录它。
但是,如果调用代码在启用日志记录时使用 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 反序列化,那么响应可能是 'read' 两次,但更冗长。