Web API и OData- передать несколько параметров
Можно ли заставить OData сделать следующее? Я хотел бы иметь возможность запросить вызов REST путем передачи параметров, которые могут не быть первичным ключом. Могу ли я вызвать метод REST, как -> GetReports(22, 2014)
или же Reports(22, 2014)
?
[HttpGet]
[ODataRoute("Reports(Id={Id}, Year={Year})")]
public IHttpActionResult GetReports([FromODataUri]int Id, [FromODataUri]int Year)
{
return Ok(_reportsRepository.GetReports(Id, Year));
}
Вот мое последнее изменение.
//Unbound Action OData v3
var action = builder.Action("ListReports");
action.Parameter<int>("key");
action.Parameter<int>("year");
action.ReturnsCollectionFromEntitySet<Report>("Reports");
мой метод для контроллера ReportsController
[HttpPost]
[EnableQuery]
public IHttpActionResult ListReports([FromODataUri] int key, ODataActionParameters parameters)
{
if (!ModelState.IsValid)
{
throw new HttpResponseException(HttpStatusCode.BadRequest);
}
int year = (int)parameters["year"];
return Ok(_reportsRepository.GetReports(key, year).Single());
}
Я пытался назвать URL-адрес, как:
http://localhost:6064/odata/Reports(key=5,year=2014)/ListReports
Не найден ресурс HTTP, соответствующий URI запроса 'http://localhost:6064/odata/Reports(key%3D5%2Cyear%3D2014)/ListReports'
.`
1 ответ
Вы можете определить функцию импорта с именем GetReports, которая имеет два параметра.
(Примечание: имя функции импорта не может совпадать с именем набора сущностей)
Настройте модель EDM как:
var builder = new ODataConventionModelBuilder();
builder.EntitySet<Report>("Reports");
var function = builder.Function("GetReports");
function.Parameter<int>("Id");
function.Parameter<int>("Year");
function.ReturnsCollectionFromEntitySet<Report>("Reports");
var model = builder.GetEdmModel();
А затем напишите свой метод как:
[HttpGet]
[ODataRoute("GetReports(Id={Id},Year={Year})")]
public IHttpActionResult WhateverName([FromODataUri]int Id, [FromODataUri]int Year)
{
return Ok(_reportsRepository.GetReports(Id, Year));
}
Тогда запрос
Get ~/GetReports(Id=22,Year=2014)
буду работать.
Для конечных точек OData v4.0 вам не нужно делать это функцией, вы можете просто сделать...
public class ReportsController : ODataController
{
[EnableQuery]
[ODataRoute("Reports({id}, {year})")]
public IQueryable<ReportModel> Get([FromODataUri] int id, [FromODataUri] int year)
{
...
}
}
Тогда вы можете назвать это как...
/Reports(42, 2019)