web-dev-qa-db-fra.com

API Web et OData - Passer plusieurs paramètres

Est-il possible d'obtenir OData pour effectuer les opérations suivantes? Je voudrais pouvoir interroger un appel REST en transmettant des paramètres qui ne sont peut-être pas la clé primaire. Puis-je appeler une méthode REST comme - > GetReports(22, 2014) ou 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));
}

Voici mon dernier changement.

  //Unbound Action  OData v3
       var action = builder.Action("ListReports");
        action.Parameter<int>("key");
        action.Parameter<int>("year");
        action.ReturnsCollectionFromEntitySet<Report>("Reports");

ma méthode pour le contrôleur 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());

            }

J'ai essayé d'appeler l'url comme:

 http://localhost:6064/odata/Reports(key=5,year=2014)/ListReports

Aucune ressource HTTP trouvée correspondant à l'URI de la demande 'http://localhost:6064/odata/Reports(key%3D5%2Cyear%3D2014)/ListReports'. `

17
Nate

Vous pouvez définir une fonction d'importation nommée GetReports qui a deux paramètres.

(Remarque: le nom de la fonction import ne peut pas être le même que le nom du jeu d'entités)

Configurez votre modèle EDM comme:

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();

Et puis écrivez votre méthode comme:

[HttpGet]
[ODataRoute("GetReports(Id={Id},Year={Year})")]
public IHttpActionResult WhateverName([FromODataUri]int Id, [FromODataUri]int Year)
{
    return Ok(_reportsRepository.GetReports(Id, Year));
}

Ensuite, la demande

Get ~/GetReports(Id=22,Year=2014)

marchera.

27
Feng Zhao