我使用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的另一个应用程序中的代码。我可以使用(int)getRespParams.StatusCode
获取状态代码编号(500)和使用getRespParams.StatusCode
获取状态代码文本(InternalError),但是如何获得“抱歉!”信息?
var getRespParams = await $"http://localhost:1234/api/Orders/{orderID}/SendEmail".PostUrlEncodedAsync();
int statusCodeNumber = (int)getRespParams.StatusCode;
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块中单独获取错误体(这是一个不同的形状)。这样你根本就没有处理反对“原始”HttpResponseMessage
的反序列化。