如何使用Flurl获取.NET Core API返回的消息内容?
首先咱们拆解下问题:你的API确实返回了带消息的状态码,但Flurl这边只拿到了状态码元数据,没去读取响应体里的实际消息内容。下面从Flurl调用端处理和API端格式优化两部分给出解决方案:
一、Flurl调用端:直接读取响应内容
你现在已经拿到了响应对象getRespParams,只是缺了读取响应体的步骤,用以下方式就能拿到"Sorry!"这条消息:
方式1:读取纯文本格式的消息
如果保持当前API的返回方式(直接返回字符串),可以用GetStringAsync()读取响应体:
var response = await $"http://localhost:1234/api/Orders/{orderID}/SendEmail" .PostUrlEncodedAsync(); int statusCodeNumber = (int)response.StatusCode; // 读取返回的消息字符串 string message = await response.GetStringAsync();
方式2:解析JSON格式的响应(推荐)
如果后续把API改成返回JSON对象,就用GetJsonAsync<T>()来解析,先定义一个简单的响应模型:
public class ApiResponse { public string Message { get; set; } }
然后调用时解析:
var response = await $"http://localhost:1234/api/Orders/{orderID}/SendEmail" .PostUrlEncodedAsync(); var apiResponse = await response.GetJsonAsync<ApiResponse>(); string message = apiResponse.Message;
二、API端:优化返回格式(更规范)
你当前的return StatusCode(500, "Sorry!")写法虽然能返回消息,但.NET Core默认可能会以text/plain格式返回字符串,或者在某些配置下包装逻辑不一致。为了更符合REST规范,建议改成以下两种方式之一:
方式1:返回统一的响应对象
定义一个通用的API响应模型,让成功/失败返回格式保持一致:
public class ApiResult { public int StatusCode { get; set; } public string Message { get; set; } } [HttpPost("{orderID}/SendEmail")] [Produces("application/json")] public ActionResult Post(int orderID) { return StatusCode(500, new ApiResult { StatusCode = 500, Message = "Sorry!" }); }
这样返回的是标准JSON,Flurl那边用GetJsonAsync<ApiResult>()就能轻松解析。
方式2:使用.NET Core内置的ProblemDetails
这是官方推荐的错误返回方式,生成符合规范的错误响应:
[HttpPost("{orderID}/SendEmail")] [Produces("application/json")] public ActionResult Post(int orderID) { return Problem(statusCode: 500, detail: "Sorry!"); }
返回的JSON会包含status、detail等标准字段,Flurl那边可以直接解析成ProblemDetails类型(需引用Microsoft.AspNetCore.Mvc命名空间):
var problemDetails = await response.GetJsonAsync<ProblemDetails>(); string message = problemDetails.Detail;
总结:你之前拿不到消息的原因
PostUrlEncodedAsync()方法只会发送请求并获取响应的元数据(比如状态码、请求头),不会自动读取响应体内容。必须显式调用GetStringAsync()、GetJsonAsync()这类方法,才能拿到响应体里的消息。
内容的提问来源于stack exchange,提问作者boilers222

