Должен ли я попытаться взять BadRequest (ModelState), возвращенный из моего API, и десериализовать в * что * с JSON.NET? - PullRequest
0 голосов
/ 10 мая 2018

TL; DR;

«Мне нравится, как мой сгенерированный клиент AutoRest десериализует мои основные сущности при работе с 200 сценариями ... но ДОЛЖЕН ли я вручную анализировать 400 сценариев?», Сказал ленивый программист

ОПИСАНИЕ:

Итак, у меня есть API (Web API 2), и я делаю все стандартные вещи ... используя POCO, которые реализуют IValidatable в дополнение к проверке на уровне свойств с использованием System.Data.DataAnnotations, мой Web API возвращает 400 ошибок, таких как это (просто пример):

        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }

И, при необходимости, я использую SwaggerResponse атрибуты, и мой swagger.json документируется таким образом, чтобы мой сгенерированный клиент знал, что 400 является жизнеспособным ответом.

Теперь, мои модульные тесты, которые непосредственно создают экземпляры контроллеров API, я намеренно пытаюсь проверить на недопустимое состояние модели. Я могу взять ответ IHttpActionResult от вызова контроллера, привести его к InvalidModelStateResult и выполнить итерацию по Словарь ModelState.

enter image description here

Но я нахожу написание чего-то похожего для моих «производственных HTTP-вызовов» с реальным HTTP-клиентом - не так просто.

Итак, ближе к сути моего вопроса:

Есть ли предпочтительный метод десериализации InvalidModelStateResult?

Итак, при взаимодействии моего API с реальными вызовами http ... через Microsoft.Rest.ServiceClient, JSON, который я получаю, имеет немного другую форму.

Пример кода контроллера MVC, взаимодействующего с моим API:

HttpOperationResponse resp = await client.SpecialLocations.PatchByIdWithHttpMessagesAsync(id, locationType, "return=representation");

if (!resp.Response.IsSuccessStatusCode)
{
    //The JSON returned here is not really in the form of an InvalidModelStateResult
    ViewBag.Error = await resp.Response.Content.ReadAsStringAsync();
    return View(locationType);
}

example of JSON when a 400 response is recieved

1 Ответ

0 голосов
/ 10 мая 2018

Итак, на данный момент я использую JObject Newtonsoft для анализа ModelState, возвращенного из моего WebAPI (опять же - он не называется таковым, как только он был получен через http-запрос), и теперь помещаю его в * 1003 моего контроллера MVC.*.

Это мой ответ на данный момент.Но рассмотрим другие, которые имеют какие-либо достоинства.Это просто кажется странной вещью, которую нужно сделать.

HttpOperationResponse resp = await client.SpecialLocations.PatchByIdWithHttpMessagesAsync(id, locationType, "return=representation");

if (resp.Response.StatusCode == HttpStatusCode.BadRequest)
{
  string jsonErrStr = await resp.Response.Content.ReadAsStringAsync();
  JObject err = JObject.Parse(jsonErrStr);
  string[] valPair = ((string)err["error"]["innererror"]["message"]).Split(":".ToCharArray());

  //now push into MVC controller's modelstate, so jQuery validation can show it
  this.ModelState.AddModelError(valPair[0].Trim(),valPair[1].Trim());
  return View(locationType);
}
...