如何使用Flurl编写HTTP请求并实现延迟执行?
Flurl实现延迟执行HTTP请求的方案
Flurl中PostJsonAsync、PostUrlEncodedAsync这类方法会立即发起请求,因为它们返回的是已启动的Task对象。要实现"先构建请求、按需执行"的逻辑,有两种常用方案:
方案一:手动构建请求对象,按需触发执行
通过FlurlRequest对象预先配置请求的所有参数(URL、请求体、Header等),直到调用SendAsync时才真正发送请求:
using System.Net.Http; using System.Text; using System.Text.Json; using Flurl; using Flurl.Http; public async Task SomeFunction(string url, object someJson, object someUrlEncodedData) { // 构建JSON POST请求(仅配置,不执行) var jsonContent = new StringContent( JsonSerializer.Serialize(someJson), Encoding.UTF8, "application/json" ); var request1 = new FlurlRequest(url) .WithContent(jsonContent); // 构建URL编码POST请求(仅配置,不执行) var formContent = new FormUrlEncodedContent( someUrlEncodedData.ToKeyValuePairs() // Flurl内置扩展,将对象转为键值对 ); var request2 = new FlurlRequest(url) .WithContent(formContent); // 手动触发请求执行 var response1 = await request1.SendAsync(HttpMethod.Post); var result1 = await response1.GetJsonAsync(); // 按需解析响应 var response2 = await request2.SendAsync(HttpMethod.Post); var result2 = await response2.GetJsonAsync(); }
这种方式的优势是灵活性高,可以在执行前随时修改请求配置(比如添加Header、调整超时时间、修改请求体等)。
方案二:用委托包装请求逻辑,延迟执行
如果不需要中途修改请求,用委托包装请求方法的调用逻辑,只有当调用委托时才会发起请求:
using Flurl; using Flurl.Http; public async Task SomeFunction(string url, object someJson, object someUrlEncodedData) { // 定义委托,此时不会执行请求 Func<Task<IFlurlResponse>> executeRequest1 = () => url.PostJsonAsync(someJson); Func<Task<IFlurlResponse>> executeRequest2 = () => url.PostUrlEncodedAsync(someUrlEncodedData); // 需要执行时调用委托 var response1 = await executeRequest1(); var result1 = await response1.GetJsonAsync(); var response2 = await executeRequest2(); var result2 = await response2.GetJsonAsync(); }
这种方式代码更简洁,适合请求配置固定、不需要动态调整的场景。
注意事项
- 尽量避免使用
async void,改用async Task,否则异步操作中抛出的异常无法被正常捕获处理。 - 如果需要批量执行多个延迟请求,还可以结合
Task.WhenAll实现并行执行:var task1 = executeRequest1(); var task2 = executeRequest2(); await Task.WhenAll(task1, task2); var result1 = await task1.Result.GetJsonAsync(); var result2 = await task2.Result.GetJsonAsync();
内容的提问来源于stack exchange,提问作者Librapulpfiction
相关产品推荐
相关产品推荐

