Swagger показывает неверный параметр запроса - PullRequest
2 голосов
/ 09 апреля 2019

У меня есть этот контроллер и метод действия:

[ApiController]
[Route("api/[controller]")]
public class AppointmentController : ControllerBase
{        
    [Route("{provider}/AvailableSlots")]
    [HttpGet]        
    public Task<AvailableSlotsResponse> GetAvailableSlots(Request<AvailableSlotsRequest> request)
    {
        return null;
    }
}

Вот модель:

    public class Request<T> where T : class
    {
        [FromRoute]
        public string Provider { get; set; }
        [FromQuery(Name = "")]
        public T Model { get; set; }
    }

    public class AvailableSlotsRequest
    {
        //[FromQuery(Name = "Location")] //Would prefer not to have to use this
        public string Location { get; set; }
    }

Мне нужно использовать Location в качестве имени параметра запроса в URL длячтобы достичь конечной точки, как и ожидалось.

напр.http://localhost/api/Appointment/Company/AvailableSlots?Location=SYD

Однако, когда я просматриваю страницу Swagger, параметр называется Model.Location, что сбивает с толку потребителей моего API:

swagger

Я могу использовать [FromQuery(Name = "Location")], чтобы заставить Swagger отображать Location, однако это выглядит очень избыточно и дублирует имя свойства.

Вот мой Swagger, настроенный в ConfigureServices():

services.AddSwaggerDocument(document =>
            {
                document.PostProcess = d =>
                {
                    d.Info.Version = Configuration["APIVersion"];
                    d.Info.Title = $"{Configuration["ApplicationName"]} {Configuration["DomainName"]} API";
                };
            });

Как сделать так, чтобы Swagger отображал Location вместо Model.Location, без необходимости дублировать слово "Location" в атрибуте [FromQuery]?

Ответы [ 2 ]

1 голос
/ 09 апреля 2019

Добавьте к параметру контроллера атрибут [FromRoute]:

    public Task<AvailableSlotsResponse> GetAvailableSlots([FromRoute]Request<AvailableSlotsRequest> request)

Удалите атрибут FromQuery в свойстве Model и раскомментируйте атрибут FromQuery из свойства de Location.

enter image description here

0 голосов
/ 12 апреля 2019

К сожалению, мне пришлось использовать [FromQuery(Name = "<PropertyName>")].

Однако я нашел лучший способ:

[ApiController]
[Route("api/[controller]")]
public class AppointmentController : ControllerBase
{        
    [Route("{provider}/AvailableSlots")]
    [HttpGet]        
    public Task<AvailableSlotsResponse> GetAvailableSlots(AvailableSlotsRequest request)
    {
        return null;
    }
}

public class Request
{
    [FromRoute]
    public string ProviderName { get; set; }
}

public class AvailableSlotsRequest : Request
{
    [FromQuery]
    public string Location { get; set; }
}

Это также означает, что модель может использовать любой атрибут, по сравнению с моей первой попыткой, когда T Model был украшен [FromQuery]

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