Проверки в ASP.NET Core 2.0: синтаксис против проблем проверки - PullRequest
0 голосов
/ 09 мая 2018

В моем приложении ASP.NET Core 2.0 я хочу выбросить 400 Bad Request, когда во входе есть проблема с синтаксисом (например, неправильно сформированный json) и 422 Unprocessable Entity для других ошибок (например, Required, StringLength и т. Д.) .

Есть ли способ узнать (возможно, изучив ModelState), является ли это проблемой синтаксиса (400) или проверкой (422)?

Это действие контроллера, которое я использую ...

    [HttpPost]
    public async Task<IActionResult> CreateArticle([FromBody] CreateArticleInput input)
    {
        if(!ModelState.IsValid)
        {
            // Return 400 or 422
        }
    }

Ответы [ 4 ]

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

Нет способа смешивать-возвращать коды возврата на уровне подшивки модели.Даже сторонние решения, такие как FluentValidation, позволяют использовать только один шаблон возврата для неудачного результата.

Как и предполагалось, добавьте дополнительную синтаксическую / семантическую проверку на уровне контроллера и оставьте проверку ввода как есть - намного чище.

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

При наличии синтаксической ошибки / неправильно сформированной полезной нагрузки связыватель модели не заполняет параметр input. Учитывая это, вы можете проверить на input == null. Если требования объекта не выполнены, ModelState.IsValid вернет false, и вы можете вернуть HTTP 422 соответственно.

Пример кода:

public class MyObj
{
    [Required]
    public string Foo { get; set; }
}


[HttpPost]
public IActionResult Post([FromBody]MyObj obj)
{
    if (obj == null)
    {
        return BadRequest();
    }

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

    return Ok();
}

При публикации недопустимой / неправильно сформированной полезной нагрузки obj будет null и будет возвращен неверный запрос (HTTP 400). Когда полезная нагрузка соответствует JSON, но свойство Foo равно null, ModelState.IsValid вернет false, что приведет к HTTP 422 с ошибками привязки проверки. Когда все хорошо, он вернет 200.

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

В зависимости от того, что вы делаете с ним, вы можете получить его из HttpContext

return StatusCode(HttpContext.Response.StatusCode);

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

Я не совсем уверен, что вы спрашиваете, звучит как CreateArticleInput, может быть, что-то вроде ввода JSON - но я бы подумал, что написание вашей собственной пользовательской связки моделей будет правильным решением. Затем, если «необработанный» ввод не отображается правильно на ваш CreateArticleInput, вы можете обращаться с ним любым удобным вам способом. и, возможно, верните следующее из вашего связывателя моделей.

bindingContext.Result = ModelBindingResult.Failed();
return Task.CompletedTask;

, а затем

в контроллере, если CreateArticleInput input равно нулю, вернуть 400 там ..

https://docs.microsoft.com/en-us/aspnet/core/mvc/advanced/custom-model-binding?view=aspnetcore-2.1

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...