Правильный способ вернуть результат расчета из Web Api - PullRequest
0 голосов
/ 24 декабря 2018

Я создаю API, который будет принимать параметры (тип double) и возвращать результат.ех.http://localhost:54897/api/Power/Nominal/6/-2

В браузере я увижу: 4.0

Вот код, который у меня пока есть:

Модель

public class PowerModel
{
    [Required]
    [Range(0,50)]
    public  double PowerFront { get; set; }

    [Required]
    [Range(-50,-1)]
    public  double PowerBack { get; set; }

    [Required]
    public  double Result { get; set; }
}

Контроллер

[Produces("application/json")]
[Route("api/Power")]
public class PowerController : Controller
{
    [HttpGet("Nominal/{powerFront}/{powerBack}")]
    public double NominalPower(PowerModel powerModel)
    {
        if (ModelState.IsValid)
        {   
            powerModel.Result = Power.NominalPower(powerModel.PowerFront, powerModel.PowerBack);
            return powerModel.Result;
        }
        else
        {
            return 0;           
        }
    }
}

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

Что-то не таккажется, правда.Я не хочу возвращать 0 в недопустимом состоянии модели, я хочу вернуть сообщение в случае неверного ввода.

Каков наилучший способ получить параметры (желательно именованные), проверить ихпараметры с атрибутами, выполнить расчет, вернуть значение при успешном вводе или показать сообщение об ошибке при неправильном вводе?

1 Ответ

0 голосов
/ 24 декабря 2018

Это то, для чего используются коды состояния HTTP.В вашем успешном случае, 200 возвращается, чтобы указать, что запрос был успешным.Для недействительного ModelState обычно возвращают 400 (что указывает на неверный запрос).

Чтобы добиться этого в ASP.NET Core, вы можете воспользоваться ActionResult<T>.Вот полный пример того, как это повлияет на NominalPower:

[HttpGet("Nominal/{powerFront}/{powerBack}")]
public ActionResult<double> NominalPower(PowerModel powerModel)
{
    if (!ModelState.IsValid)
        return BadRequest(ModelState);

    powerModel.Result = Power.NominalPower(powerModel.PowerFront, powerModel.PowerBack);
    return powerModel.Result;
}

В приведенном выше примере мы передаем ModelState в метод BadRequest, который будет сериализован как JSON, чтобы показать списокошибки, возникшие при проверке модели.Если вы предпочитаете не включать это, вы можете просто опустить аргумент ModelState при вызове BadRequest.


В качестве альтернативы, вы можете просто украсить свой класс PowerController с помощью ApiController атрибут, который будет вызывать любые запросы, которые приводят к недопустимому ModelState - , автоматически возвращают 400 с сериализованными ошибками JSON.Вот пример такого подхода:

[Produces("application/json")]
[Route("api/Power")]
[ApiController]
public class PowerController : Controller
{
    [HttpGet("Nominal/{powerFront}/{powerBack}")]
    public double NominalPower(PowerModel powerModel)
    {
        powerModel.Result = Power.NominalPower(powerModel.PowerFront, powerModel.PowerBack);
        return powerModel.Result;
    }
}

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

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