Как использовать Swagger с динамическими параметрами из метода действий Web API? - PullRequest
0 голосов
/ 19 января 2019

Я пишу свои контроллеры Web API нестандартным способом, где я получаю параметры в виде динамических объектов.

Это создает проблему с NSwag. Поскольку в определении метода нет параметров, NSwag не может сгенерировать то, что нужно.

Интересно, есть ли возможность использовать NSwag в этой ситуации? Может быть, есть некоторые атрибуты, которые я могу добавить к методам, чтобы NSwag мог генерировать API?

[HttpPost]
[ActionName("create-account")]
public IHttpActionResult CreateAccount()
{
    var body = Request.Content.ReadAsStringAsync().Result;

    dynamic json = Utils.GetJsonBody(body);

    if (!Utils.GetJsonPropertyValueByPropertyName<String>(json, "email", out String email))
    {
        return Content(HttpStatusCode.BadRequest, "Please provide a valid email.".AsApiMessageResult());
    }

    if (!Utils.GetJsonPropertyValueByPropertyName<String>(json, "name", out String name))
    {
        return Content(HttpStatusCode.BadRequest, "Please provide an account name.".AsApiMessageResult());
    }

    if (!Utils.GetJsonPropertyValueByPropertyName<String>(json, "domain", out String domain))
    {
        return Content(HttpStatusCode.BadRequest, "Please provide a valid domain.".AsApiMessageResult());
    } 

1 Ответ

0 голосов
/ 19 января 2019

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

  • Вы не получаете Intellisense для ваших объектов
  • Это не такфункциональный означает, что сложнее определить, взглянув на метод, что он принимает за ввод и вывод, что усложняет понимание
  • Труднее выполнить модульное тестирование вашего кода, потому что теперь вам нужно создатьHTTP-запрос для вашего контроллера Web API
  • Требуется больше кода, чем для работы с правильными объектами

Вместо этого мы должны определить подходящую модель для публикации в нашем API.Это позволит веб-API выполнять свою работу, механизм связывания будет обрабатывать преобразование запроса в экземпляр CreateAccountRequest.

public class CreateAccountRequest
{
    public string Email { get; set; }

    public string Name { get; set; }

    public string Domain { get; set; }
}

Тогда мы можем заставить наш метод действия принять этот экземпляр этого класса в качестве параметра..

[HttpPost]
[ActionName("create-account")]
public IHttpActionResult CreateAccount(CreateAccountRequest request)
{
    //now here you can validate the request if you want
}

Swagger должен быть в состоянии понять этот метод сейчас, позволяя NSwag сгенерировать полезного клиента.

Обратите внимание, что вместо выполнения пользовательской проверки C # вы должны заглянуть во встроенныйинструменты, предоставляемые веб-API для проверки модели .Тогда все, что вам нужно сделать, это проверить ModelState, а не проверять вручную каждый параметр.Другие инструменты также могут посмотреть на атрибуты ваших моделей, улучшая их работу.

...