【问题标题】:Swagger showing incorrect query paramSwagger 显示不正确的查询参数
【发布时间】:2019-08-30 11:13:10
【问题描述】:

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

[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 的使用者感到困惑:

我可以使用[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] 属性中复制“位置”一词?

【问题讨论】:

  • 不是专注于回答这个问题,但我不能避免问:你真的需要将两个字符串参数包装到一个泛型类中吗?这似乎只是增加了噪音和复杂性。当然,除非你有充分的理由这样做。
  • @jpgrassi 这实际上是一个更复杂的模型,但为了简单起见,我只留下了 Location 字符串。

标签: c# asp.net-core swagger


【解决方案1】:

将属性[FromRoute]添加到控制器参数中:

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

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

【讨论】:

  • 我的问题可能还不够清楚(我刚刚更新了它)。我宁愿不必使用 [FromQuery(Name = "Location")],因为这正是该属性的名称。
【解决方案2】:

不幸的是,我不得不使用[FromQuery(Name = "&lt;PropertyName&gt;")]

但是我找到了更好的方法:

[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]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-09
    • 2023-03-09
    • 2021-12-09
    • 1970-01-01
    相关资源
    最近更新 更多