1

TL;博士;

“我喜欢我生成的 AutoRest 客户端在处理 200 个场景时如何反序列化我的主要实体。但是,我必须手动解析 400 个场景吗?”,懒惰的程序员说

细节:

所以,我有一个 API,(Web API 2),我做了所有标准的东西..IValidatable除了使用我的 Web API 实现的属性级验证之外,使用 POCO 会System.Data.DataAnnotations返回 400 个这样的错误(只是一个例子):

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

并且,在适当的情况下,我使用SwaggerResponse属性,并记录了我的 swagger.json,以便我生成的客户端知道 400 是可行的响应。

现在,我的单元测试直接实例化了 api 控制器,我故意尝试测试无效的模型状态。我可以 IHttpActionResult从控制器调用中获取响应,并将其转换为InvalidModelStateResult并遍历 ModelState 字典。

在此处输入图像描述

但是,我发现使用实际的 HTTP 客户端为我的“生产 HTTP 调用”编写类似的东西——并不那么简单。

所以,越来越接近我的问题的核心:

是否有反序列化的首选方法InvalidModelStateResult

因此,当通过实际的 http 调用与我的 API 交互时..通过Microsoft.Rest.ServiceClient我返回的 JSON 的形状略有不同..

与我的 API 交互的示例 MVC 控制器代码:

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

收到 400 响应时的 JSON 示例

4

1 回答 1

0

所以,就目前而言,我使用 NewtonsoftJObject解析ModelState从我的 WebAPI 返回的(再次——一旦通过 http 请求检索到它并没有真正命名),现在将它推入我的 MVC 控制器的ModelState.

这是我现在的答案。但会考虑其他有任何优点的人。这似乎是一件很奇怪的事情。

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);
}
于 2018-05-10T15:38:41.887 回答