Как настроить swagger для создания сложных параметров [FromUri] GET в Swagger - PullRequest
0 голосов
/ 30 августа 2018

Я пытался понять это уже неделю. Пришло время спросить у С.О. У меня здесь 4 цели:

  1. Код контроллера должен использовать входные данные запроса ViewModel для проверки. (фрагмент кода контроллера)
  2. Код клиента для моего API должен использовать красивый синтаксис модели. (Фрагмент кода клиента)
  3. Для страницы пользовательского интерфейса swagger я хотел бы, чтобы интерфейс "Try me" был пригоден для использования. Либо набор текстовых полей, либо текстовая область для BLOB-объекта json для сериализации и отправки.
  4. GET запрос

Фрагмент кода клиента:

var response = client.GetUserProductHistory(new Models.UserProductHistoryRequest() {
    Locale = "en-US",
    UserPuid = "FooBar"
});

Фрагмент контроллера

    [HttpGet]
    [HasPermission(Permissions.CanViewUserProductHistory)]
    public JsonPayload<UserProductHistoryResponse> GetUserProductHistory([FromUri]UserProductHistoryRequest model)
    {
        JsonPayload<UserProductHistoryResponse> output = new JsonPayload<UserProductHistoryResponse>();
        return output;
    }

Я пытался использовать [FromBody]. Это выглядит великолепно, но я получаю сообщение об ошибке «GET-запросы не поддерживают FromBody». Я попытался использовать [FromUri], но затем сгенерированный клиент дает мне примерно 15 параметров метода на вызов в сгенерированном клиенте. Я попытался использовать [FromUri] и операционные фильтры, чтобы параметры были сжаты в параметры Ref (сложные объекты, как определено в спецификации). Это на самом деле работало прилично для поколения клиента и стороны сервера Проблема в том, что интерфейс для чванства выглядит действительно неубедительным. Один текстовый блок, который вы не можете использовать очень хорошо. Если я смогу выяснить, как заставить пользовательский интерфейс Swagger изменить внешний вид запроса [FromUri], чтобы он более точно соответствовал пользовательскому интерфейсу [FromBody], я буду в хорошей форме. Любые идеи или уже существующий контент, который укажет мне правильное направление здесь?

1 Ответ

0 голосов
/ 31 августа 2018

Swagger - это не ограничение, а сам REST. По определению REST, веб-серверы должны игнорировать тело входящего запроса во всех методах HTTP GET. ASP.NET обеспечивает соблюдение этого соглашения, поэтому вы не можете использовать [FromBody] в методе GET.

При разработке REST API рекомендуется использовать методы POST для фактического поиска. Это позволит использовать [FromBody], и в качестве бонуса Swagger будет вести себя так, как вы этого хотите. Смотрите здесь для поддержки мнение: https://stackoverflow.com/a/18933902/66101

...