Как создать веб-API ASP .NET MVC4 для поиска по нескольким параметрам

Как создать веб-API ASP.NET MVC4 json, который позволяет искать продукты по идентификатору, штрих-коду, поисковому запросу или извлекать все продукты с даты?

Ниже я попытался использовать контроллер ASP.NET MVC4.

Вызов

http://localhost:52216/admin/api/Products/GetSince?since=2014-03-16%2021:47:29&_=1395007124964

возвращает ошибку

Multiple actions were found that match the request:

System.Net.Http.HttpResponseMessage GetSince(System.String) on type MyApp.Controllers.ProductsController\r\n


System.Net.Http.HttpResponseMessage GetId(System.String) on type MyApp.Controllers.ProductsController"

Как это исправить? Этот код выглядит некрасиво, он содержит ряд похожих методов. Какой лучший способ создать такой API? Как улучшить этот код? Следует использовать метод Http GET, но имена методов и подписи могут быть изменены.

Используются ASP.NET/Mono MVC4, jquery, jquery UI. Сервер Windows 2003 также должен поддерживаться, поэтому нельзя использовать .NET 4.5 или MVC5.

public class ProductsController : ApiController
{
    [HttpGet]
    public HttpResponseMessage GetSince([FromUri]string since))
    {
        var toodelist = GetProducts(since, null, null, null);
        return Request.CreateResponse(HttpStatusCode.OK,
           new { products = toodelist.ToArray() });
    }

    [HttpGet]
    public HttpResponseMessage GetId([FromUri]string id)
    {
        var toodelist = GetProducts(null, null, id, null);
        return Request.CreateResponse(HttpStatusCode.OK,
           new { products = toodelist.ToArray() });
    }


    [HttpGet]
    public HttpResponseMessage GetBarcode([FromUri]string barcode)
    {
        var toodelist = GetProducts(null, barcode, null, null);
        return Request.CreateResponse(HttpStatusCode.OK,
           new { products = toodelist.ToArray() });
    }

    [HttpGet]
    public HttpResponseMessage GetTerm([FromUri]string term)
    {
        var toodelist = GetProducts(null, null, null, term);
        return Request.CreateResponse(HttpStatusCode.OK,
           new { products = toodelist.ToArray() });
    }

    static List<Product> GetProducts(string since, string barcode, string id, string term)
    {
        ... retrieves list of product from database using specified search criteria
        if not null
    }
}

person Andrus    schedule 16.03.2014    source источник
comment
Вашу непосредственную проблему можно решить, добавив маршрут WebApiConfig для api/{controller}/{action}/, но это не улучшит код.   -  person Andrew McLachlan    schedule 17.03.2014


Ответы (1)


Как насчет использования критерия поиска DTO, подобного этому?

public class SearchCriteria
{
    public int? Id { get; set; }
    public DateTime? Since { get; set; }
    // Other properties
}

Метод действия будет таким.

public class ProductsController : ApiController
{
    public HttpResponseMessage GetProducts([FromUri]SearchCriteria crit))
    {
        // Validate and clean crit object
        var list = GetProducts(crit);
        // return list
    }
}

GetProducts может вернуть список продуктов на основе свойств, установленных в объекте SearchCriteria. Если поле строки запроса отсутствует, соответствующее свойство будет пустым.

person Badri    schedule 17.03.2014