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