Как указать маршруты к следующей конечной точке API с помощью маршрутизации атрибутов?
Возвращенный объект продукта имеет несколько атрибутов, а также поля Store и Manufacturer, которые содержат либо значение NULL, либо объекты Store и Manufacturer соответственно.
[Route("api/[controller]")]
[ApiController]
public class ProductsController : ControllerBase {
[HttpGet ("")]
public async Task<ActionResult<IEnumerable<Product>>> Get(
bool stores = false, int storeId = 0,
bool manufacturers = false, int manufacturerId = 0
) {
// Default - returns all Products
// stores = true will set Product.Store = to the store object
// storeId = 1 will filter Products to those in Store 1
// manufacturer = true will st Product.Manufacturer to a manufacturer object
// manufacturerId = 1 will filter Product to those produced by manufacturer 1
var products = await _ctx.GetProducts(
stores, storeId,
manufacturers, manufacturerId
);
return products.ToList();
}
Я хотел бы иметь несколько удобочитаемых маршрутов для доступа и соответствующей настройки параметров.
[HttpGet ("")]
/api/Products
to return objects with Store and Manufacturer = null. This is desirable.("")
не нужен, когда он один, но необходим, если я добавляю другие маршруты.
[Route("{stores=false}/{storeId=0})]
/api/Products/true
returns Product objects with Store filled and Manufacturer = null. This is good./api/Products/true/1
фильтрует в Магазине 1, что тоже хорошо.- Но это дурацкий URL (правда? - товары, магазины или производители?)
[Route("Stores/{storeId?})]
/api/Products/Stores/1
leaves stores = false, though filters on Store 1 but does not include the stores object. "Stores" is not in the route data. It is in the Request.Path but I don't want to go there./api/Products/Stores?storeId=1
не работает. Request.QueryString.Value =? StoreId = 1, но это не привязывается к моему аргументу storeId.
Я мог бы продолжить описание своих других экспериментов, но достаточно сказать, что ни один из них не дал мне результатов, которые я ищу. Я думаю, что неправильно понимаю маршрутизацию атрибутов, но, возможно, она не была предназначена для того, что я пытаюсь сделать.
Я предполагаю, что я бы хотел либо изменить один URL-адрес с помощью строки запроса, например,
/api/Products?stores=true&manufacturerId=1
для получения товаров с информацией о магазине, произведенных производителем 1, или/api/Products?storeId=1,stores=true,manufacturers=true
, чтобы получить полную информацию о товарах в магазине 1
В качестве альтернативы было бы нормально иметь
/api/Products/Stores/1
, чтобы получить Товары с информацией о магазине для товаров в магазине 1/api/Products/Stores/Manufacturers/1
, чтобы получить проекты с информацией о магазине и производителе для произведенных производителем 1
Фактически, я открыт для любой читаемой схемы URL.
Спасибо!