Swagger显示不正确的查询参数

问题描述 投票:2回答:2

我有这个控制器和动作方法:

[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,但这感觉非常多余并重复属性名称。

这是我在ConfigureServices()设置的Swagger:

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

我怎样才能使Swagger显示Location而不是Model.Location,而不必在[FromQuery]属性中复制“Location”一词?

c# asp.net-core swagger
2个回答
1
投票

添加到controller参数的属性[FromRoute]

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

删除Model属性中的属性FromQuery,并从de Location Property取消注释属性FromQuery

enter image description here


0
投票

不幸的是我不得不使用[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]装饰

© www.soinside.com 2019 - 2024. All rights reserved.