6

我使用 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!");
}

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

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

1 回答 1

15

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

var message = await getRespParams.Content.ReadAsStringAsync();

需要注意的一点是 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();
}

这里的一个好处是你可以在成功的情况下使用 FlurlReceiveJson直接获取响应体,并在 catch 块中单独获取错误体(这是一种不同的形状)。这样你就根本不用处理反序列化“原始” HttpResponseMessage

于 2018-05-31T20:56:38.680 回答