Сгенерированный пользовательский интерфейс не учитывает значение JsonProperty, используя Swashbuckle AspNetCore - PullRequest
0 голосов
/ 25 мая 2018

Я создал класс, который хочу использовать для отправки информации о сортировке и нумерации страниц, чтобы применить ее к моим большим коллекциям.У меня есть служба .NET Core Web API, которая будет получать запросы и принимать мой объект в качестве ввода FromQuery.Я хотел придерживаться определенных соглашений об именах (например, Microsoft Rest API Guidelines ) для имен параметров, таких как $orderby, $top, $skip и т. Д., И аннотировал свойства класса с помощьюJsonProperty.

Тем не менее, в сгенерированном swagger doc они просто отображаются как имя свойства, что является проблемой в тех случаях, когда мое свойство называется, например, Take, но параметр запроса должен быть $top.Я хотел бы, чтобы сгенерированные документы соответствовали, чтобы не создавать путаницы для потребителей API.Все, что я читаю, указывает на то, что это должно сработать, и я озадачен, почему это не для меня.

Вот мой класс с аннотациями, использующими Newtonsoft.Json.JsonPropertyAttribute

[JsonObject]
public class QueryParams {

    [JsonProperty( "$orderBy" )]
    public string OrderBy { get; set; }

    [JsonProperty( "$skip" )]
    public int? Skip { get; set; }

    [JsonProperty( "$top" )]
    public int? Take { get; set; }

    [JsonProperty( "$maxpagesize" )]
    public int? MaxPageSize { get; set; }

    [JsonProperty( "$count" )]
    public bool? IncludeCount { get; set; }
}

А затем, например, мой метод действия Web API будет выглядеть примерно так

    [HttpGet( "type/{type}" )]
    public async Task<IActionResult> GetByType( 
        string type, 
        [FromQuery]QueryParams parameters ) 
    {
       /* ... */ 

    }

Iпробовал несколько вещей, таких как попытка использовать MapType, как отмечено в Переопределить схему для определенных типов , но просто не повезло.Цените любые идеи, которые кто-либо может дать по этому поводу.

1 Ответ

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

Согласно этой проблеме GitHub , JsonSerializer не используется для привязки к классу для запросов GET.Вместо этого вам нужно настроить привязку модели.

Итак, когда вы используете класс для представления параметров запроса, JsonSerializer не задействуется.Вместо этого привязка модели MVC используется для назначения значений непосредственно из запроса в свойствах экземпляра.

Итак, если вы хотите явно указать требуемый регистр для этого поведения и, следовательно, сгенерированное описание, вам нужно настроитьповедение привязки модели тоже.Я сейчас не на своем ноутбуке, но не в своей голове, я думаю, что вы можете аннотировать свойства с помощью «FromQuery» и установить имя привязки таким образом.

Следующее должно работать, если яправильно понять обсуждение в вопросе GH:

public class QueryParams {

    [FromQuery( Name = "$orderBy" )]
    public string OrderBy { get; set; }

    [FromQuery( Name = "$skip" )]
    public int? Skip { get; set; }

    [FromQuery( Name = "$top" )]
    public int? Take { get; set; }

    [FromQuery( Name = "$maxpagesize" )]
    public int? MaxPageSize { get; set; }

    [FromQuery( Name = "$count" )]
    public bool? IncludeCount { get; set; }
}
...