Чванство, показывающее неверный параметр запроса

#c# #asp.net-core #swagger

#c# #asp.net-core #чванство

Вопрос:

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

 [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 , однако это кажется очень избыточным и дублирует имя свойства.

Вот мой 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] атрибуте?

Комментарии:

1. Не то чтобы я был сосредоточен на ответе на вопрос, но я не могу избежать вопроса: вам действительно нужно обернуть два параметра strings в универсальный класс? Кажется, это просто добавляет шума и сложности. Если, конечно, у вас нет на это веской причины.

2. @jpgrassi На самом деле это более сложная модель, но чтобы упростить вопрос, я просто оставил строку Location.

Ответ №1:

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

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

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

введите описание изображения здесь

Комментарии:

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

Ответ №2:

К сожалению, мне пришлось использовать [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]