2014-07-07 25 views
14

È possibile ottenere OData per eseguire quanto segue? Mi piacerebbe essere in grado di interrogare una chiamata REST trasmettendo parametri che potrebbero non essere la chiave primaria. Posso chiamare un metodo REST come ->GetReports(22, 2014) o Reports(22, 2014)?API Web e OData-Pass Parametri multipli

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

Ecco la mia ultima modifica.

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

il mio metodo per il controller 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()); 

      } 

Ho provato a chiamare l'url del tipo:

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

è stata trovata alcuna risorsa HTTP che corrisponde l'URI della richiesta 'http://localhost:6064/odata/Reports(key%3D5%2Cyear%3D2014)/ListReports' .`

risposta

23

È possibile definire un'importazione di funzione denominata GetReports con due parametri.

(Nota: il nome della funzione di importazione non può essere lo stesso con entità nome impostato)

Configurare il modello EDM come:

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

e poi scrivere il tuo metodo come:

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

Quindi la richiesta

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

funzionerà.

+0

Come può essere fatto con Odatav3? v3 non ha una funzione. – Keith

+0

Devo usare Odata v3 perché sto usando Jaydata e funziona solo con v3. Se uso Jaydata con Odata v4 solleva un errore 404. Qualsiasi soluzione con v3? Grazie – Keith

+1

Con v3, è possibile definire un'azione. Se si definisce un'azione non associata, è necessario utilizzare HttpPost e passare i parametri attraverso il corpo della richiesta ed è necessario aggiungere un metodo "HandleUnmappedRequest" nel controller per far corrispondere la richiesta di azione non associata. Se lo si definisce come un'azione associata associata all'entità impostata, sebbene ciò non abbia senso, è possibile aggiungere un metodo "[ActionName] OnCollectioinOf [EntityTypeName]" e chiamare HttpPost "~/[EntitySetName]/[ActionName]", e passare i parametri nel corpo della richiesta. –