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

时间:2018-05-31 18:43:20

标签: api asp.net-core api-design http-status-codes flurl

我使用C#在.NET Core 2中创建了一个API。它返回带有状态代码和字符串消息的ActionResult。在另一个应用程序中,我使用Flurl调用API。我可以获取状态代码,但我找不到获取消息的方法。如何获取消息或我需要在API中进行哪些更改才能将消息传递给Flurl以获取它?

这是API的代码。 "消息"在这个例子中是#34;抱歉!"。

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

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

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

1 个答案:

答案 0 :(得分:5)

PostUrlEncodedAsync会返回HttpResponseMessage个对象。要将正文作为字符串,请执行以下操作:

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

需要注意的一点是,默认情况下,Flurl会在非2XX响应上抛出异常。 (这是configurable)。如果调用不成功,通常只关心状态代码,因此典型的模式是使用try / catch块:

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

这里的一个优点是你可以使用Flurl的ReceiveJson直接在成功案例中获取响应主体,并在catch块中单独获取错误主体(这是一个不同的形状)。这样你就不会处理反序列化&#34; raw&#34;完全HttpResponseMessage