Как получить сообщение от API с помощью Flurl?

Я создал API в .NET Core 2, используя C #. Он возвращает ActionResult с кодом состояния и строковым сообщением. В другом приложении я вызываю API с помощью Flurl. Я могу получить номер кода состояния, но не могу найти способ получить сообщение. Как мне получить сообщение или что мне нужно изменить в 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;

person boilers222    schedule 31.05.2018    source источник


Ответы (1)


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();
}

Одним из преимуществ здесь является то, что вы можете использовать Flurl ReceiveJson для получения тела ответа напрямую в успешных случаях и получить тело ошибки (которое имеет другую форму) отдельно в блоке catch. Таким образом, вы вообще не имеете дело с десериализацией "сырого" HttpResponseMessage.

person Todd Menier    schedule 31.05.2018