2012-05-18 15 views
17

Me parece un poco absurdo preguntar esto, pero no puedo encontrar la forma de obtener los parámetros para una solicitud get en /api/foo?sort=name por ejemplo.Cómo obtener parámetros GET con ASP.NET MVC ApiController

En la clase ApiController, di un public string Get(). Poner Get(string sort) hace que /api/foo sea una mala solicitud. La instancia de solicitud en el ApiController es del tipo System.Net.Http.HttpRequestMessage. No tiene una propiedad QueryString o Parameters ni nada.

+0

¿Es este su get/id o está tratando de hacer su get? Para un get sin id, devuelve un IQueryable. Necesitará tanto un GET() como un GET (id) si desea soportar completamente REST. – Maess

+0

Lo siento, debería haber especificado. Estoy intentando crear una API para devolver un json cuyo contenido está influenciado por el parámetro get? No expongo completamente la fuente de datos directamente a través de la API – xster

+0

Si necesita evaluar más que la ID, deberá ir a IQueryable y usar Odata. – Maess

Respuesta

12

Se podía utilizar

HttpContext.Current.Request.QueryString 
+5

esto no funciona en el contexto de ApiController en mvc3 – BraveNewMath

0

¿Está tratando de crear un servicio web OData? Si es así, solo devuelve un IQueryable, y la API web hará el resto.

20

El ApiController está diseñado para funcionar sin el objeto HttpContext (por lo que es portátil, y que le permite ser alojado fuera de IIS).

Todavía se puede acceder a los parámetros de cadena de consulta, pero se hace a través de la siguiente propiedad:

Request.GetQueryNameValuePairs() 

He aquí un bucle de ejemplo a través de todos los valores:

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

GetQueryNameValueParirs() no era disponible en el objeto Solicitud. Funcionó después de "usar System.Net.Http;" –

6

Aquí hay un ejemplo que pone la querystring q de la solicitud y la usa para consultar cuentas:

 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 se puede llamar entonces así:?

url/api/Cuentas q = p

+0

O mejor aún: var q = Request.GetQueryNameValuePairs(). SingleOrDefault (nv => nv.Clave == "q"); –

1

Obtener todos los pares de nombre/valor cadena de consulta en una variable:

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

luego extraer un parámetro de cadena de consulta especificada

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

también puede utilizar el siguiente

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

Es posible que esto no funcione según lo previsto cuando se devuelve el valor predeterminado para un KeyValuePair cuando se usa de inmediato .Value en él. –

+0

@LarsCelie funciona, funciona al menos para mí :) – Khateeb321

Cuestiones relacionadas