Flurl Client - возможно ли получить доступ к заголовкам из неудачного запроса? - PullRequest
1 голос
/ 24 апреля 2020

Я использую Flurl Client для вызова спокойного API с данными поста. На сервере выполняется проверка данных, которые я отправляю, и возвращается заголовок, содержащий сообщение об ошибке для пользователя.

Поскольку требование запроса не удовлетворяет, сервер помечает запрос как 400 BadRequest. В приведенном ниже коде в строке cli.Request(uri).PostJsonAsync(data) он выдает FlurlHttpException с соответствующим кодом состояния.

Теперь, когда существует проблема с вводом данных пользователем, я хочу сообщить пользователю сообщение об ошибке, которое я получаю от сервера в заголовке. Однако я не могу получить доступ к заголовкам ответа, так как запрос не выполнен.

Есть ли другой способ получить доступ к заголовкам ответа из неудавшегося запроса с помощью Flurl?

  try
  {
    using (var cli = new FlurlClient(baseUrl))
    {
        var httpResponse = await cli.Request(uri).PostJsonAsync(data);
        var errorMessage = httpResponse.GetHeaderValue("errorMessage");
    }
  }
  catch (FlurlHttpException ex)
  {
  }

Ответы [ 2 ]

1 голос
/ 25 апреля 2020

Использование обработчика событий работает, но я думаю, что это лучше для сквозных задач, таких как ведение журнала, когда вы не хотите загромождать основной поток вашего приложения. В основном вы хотите разрешить и / или обработать 400 ответов как часть этого основного потока. Вы можете сделать это более напрямую с помощью AllowHtttpStatus , который может быть установлен на клиенте:

cli.AllowHtttpStatus(HttpStatusCode.BadRequest);

или запросом:

var httpResponse = await cli
    .Request(uri)
    .AllowHttpStatus(HttpStatusCode.BadRequest)
    .PostJsonAsync(data);

В любом случае вызов не будет выдавать 400.

Еще один способ сделать это, и я бы порекомендовал, если ваше приложение logi c принимает совершенно другой путь при условии ошибки, чем при условии успеха, - это сохранить ваш try/catch на месте и используйте свойство Response исключения для обработки условия ошибки:

try
{
    await cli.Request(uri).PostJsonAsync(data);
    // handle success condition
}
catch (FlurlHttpException ex) when (ex.Response?.StatusCode == 400)
{
    var errorMessage = ex.Response.GetHeaderValue("errorMessage");
    // handle error condition
}

В качестве примечания, в версии 3.0 появятся некоторые важные изменения, о которых вы должны знать поскольку они касаются некоторых из этих областей напрямую:

https://github.com/tmenier/Flurl/issues/354

https://github.com/tmenier/Flurl/issues/488

0 голосов
/ 24 апреля 2020

Я настраиваю обработчик событий ошибок, чтобы сообщать о любой ошибке. В результате код не переходит к блоку исключения, он асинхронно запускает обработчик событий, а остальная часть моего последующего кода выполняет ОК с соответствующим httpResponseMessage, StatusCode, заголовками всего.

  ...
    FlurlHttp.Configure(settings => settings.OnErrorAsync = HandleFlurlErrorAsync);
    using (var cli = new FlurlClient(baseUrl))
    {
        var httpResponse = await cli.Request(uri).PostJsonAsync(data);
        var errorMessage = httpResponse.GetHeaderValue("errorMessage");
    }
  ...

private async Task HandleFlurlErrorAsync(HttpCall call)
{
  //Log your exception here
  call.ExceptionHandled = true;
}

enter image description here

...