如何使用Flurl从API获取消息?

boi*_*222 3 api api-design http-status-codes flurl asp.net-core

我已经使用C#在.NET Core 2中创建了一个API。它返回ActionResult带有状态代码和字符串消息的。在另一个应用程序中,我使用Flurl调用API。我可以获取状态码号,但是找不到消息的方式。我如何获取消息,或者需要什么更改API才能以某种方式将消息放入Flurl即可获取?

这是API的代码。在此示例中,“消息”为“对不起!”。

[HttpPost("{orderID}/SendEmail")]
[Produces("application/json", Type = typeof(string))]
public ActionResult Post(int orderID)
{
    return StatusCode(500, "Sorry!");
}
Run Code Online (Sandbox Code Playgroud)

这是另一个调用API的应用程序中的代码。我可以使用获取状态代码编号(500),(int)getRespParams.StatusCode并使用获取状态代码文本(InternalError)getRespParams.StatusCode,但是如何获得“抱歉!” 信息?

var getRespParams = await $"http://localhost:1234/api/Orders/{orderID}/SendEmail".PostUrlEncodedAsync();
int statusCodeNumber = (int)getRespParams.StatusCode;
Run Code Online (Sandbox Code Playgroud)

Tod*_*ier 8

PostUrlEncodedAsync返回一个HttpResponseMessage对象。要将主体作为字符串,只需执行以下操作:

var message = await getRespParams.Content.ReadAsStringAsync();
Run Code Online (Sandbox Code Playgroud)

要注意的一件事是,默认情况下,Flurl在非2XX响应上引发异常。(这是可配置的)。通常,仅在调用失败时才关心状态代码,因此典型的模式是使用try / catch块:

try {
    var obj = await url
        .PostAsync(...)
        .ReceiveJson<MyResponseType>();
}
catch (FlurlHttpException ex) {
    var status = ex.Call.HttpStatus;
    var message = await ex.GetResponseStringAsync();
}
Run Code Online (Sandbox Code Playgroud)

这里的一个优点是,ReceiveJson在成功的情况下,您可以使用Flurl 直接获取响应主体,并在catch块中单独获取错误主体(形状不同)。这样,您根本不需要处理反序列化“原始”操作HttpResponseMessage