2012-05-18 14 views
17

Mi sento un po 'assurdo chiedere questo, ma non riesco a trovare un modo per ottenere parametri per una richiesta di ottenere a /api/foo?sort=name per esempio.Come ottenere i parametri GET con ASP.NET MVC ApiController

Nella classe ApiController, ho dato un public string Get(). Mettere Get(string sort) rende una richiesta errata /api/foo. L'istanza richiesta nello ApiController è di tipo System.Net.Http.HttpRequestMessage. Non ha una proprietà QueryString o Parameters o altro.

+0

È questo il tuo get/id o stai cercando di ottenere? Per ottenere senza ID restituire un IQueryable. Avrai bisogno sia di un GET() che di un GET (id) se vuoi supportare pienamente REST. – Maess

+0

Siamo spiacenti, dovrebbe aver specificato. Sto cercando di creare un'API per restituire un json il cui contenuto è influenzato dal parametro get. Non sto esponendo l'origine dati direttamente tramite l'API – xster

+0

Se è necessario valutare su un numero superiore all'ID, sarà necessario passare a IQueryable e utilizzare Odata. – Maess

risposta

12

Si potrebbe utilizzare

HttpContext.Current.Request.QueryString 
+5

questo non funziona nel contesto di ApiController in mvc3 – BraveNewMath

0

Stai provando a creare un servizio web OData? In tal caso, è sufficiente restituire un IQueryable e l'API Web farà il resto.

20

L'ApiController è progettato per funzionare senza l'oggetto HttpContext (rendendolo portatile e permettendo così di essere ospitato al di fuori di IIS).

È ancora possibile accedere ai parametri di stringa di query, ma è fatto attraverso la seguente proprietà:

Request.GetQueryNameValuePairs() 

Ecco un ciclo esempio attraverso tutti i valori:

foreach (var parameter in Request.GetQueryNameValuePairs()) 
{ 
    var key = parameter.Key; 
    var value = parameter.Value; 
} 
+3

GetQueryNameValueParirs() non era disponibile sull'oggetto Richiesta. Ha funzionato dopo "using System.Net.Http;" –

6

Ecco un esempio che ottiene la querystring q dalla richiesta e la utilizza per interrogare gli account:

 var q = Request.GetQueryNameValuePairs().Where(nv => nv.Key =="q").Select(nv => nv.Value).FirstOrDefault(); 
     if (q != null && q != string.Empty) 
     { 
      var result = accounts.Where(a=>a.Name.ToLower().StartsWith(q.ToLower())); 
      return result; 
     } 
     else 
     { 
      throw new Exception("Please specify a search query"); 
     } 

Thi s può essere chiamato poi in questo modo:?

url/api/Conti q = p

+0

O anche meglio: var q = Request.GetQueryNameValuePairs(). SingleOrDefault (nv => nv.Chiave == "q"); –

1

Ottenere tutte le coppie nome/valore querystring in una variabile:

IEnumerable<KeyValuePair<string, string>> queryString = request.GetQueryNameValuePairs(); 

quindi estrarre un parametro querystring specificato

string value = queryString.Where(nv => nv.Key =="parameterNameGoesHere").Select(nv => nv.Value).FirstOrDefault(); 
0

È inoltre possibile utilizzare il seguente

var value = request.GetQueryNameValuePairs().Where(m => m.Key == "paramName").SingleOrDefault().Value; 
+0

Questo potrebbe non funzionare come previsto quando viene restituito il valore predefinito per un KeyValuePair quando si utilizza immediatamente .Value su di esso. –

+0

@LarsCelie funziona, funziona almeno per me :) – Khateeb321

Problemi correlati