Je me sens un peu absurde de demander cela, mais je ne trouve pas le moyen d’obtenir les paramètres d’une requête get à l’aide de /api/foo?sort=name
par exemple.
Dans la classe ApiController
, j'ai donné un public string Get()
. Mettre Get(string sort)
fait de /api/foo
une requête incorrecte. L'instance de demande dans ApiController
est de type System.Net.Http.HttpRequestMessage
. Il n'a pas de propriété QueryString
ou Parameters
ou quoi que ce soit.
Vous pouvez simplement utiliser
HttpContext.Current.Request.QueryString
ApiController est conçu pour fonctionner sans l'objet HttpContext (ce qui le rend portable et lui permet d'être hébergé en dehors d'IIS).
Vous pouvez toujours accéder aux paramètres de la chaîne de requête, mais cela se fait via la propriété suivante:
Request.GetQueryNameValuePairs()
Voici un exemple de boucle à travers toutes les valeurs:
foreach (var parameter in Request.GetQueryNameValuePairs())
{
var key = parameter.Key;
var value = parameter.Value;
}
Voici un exemple qui obtient la chaîne de requête q de la demande et l'utilise pour interroger des comptes:
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");
}
Ceci peut être appelé alors comme ceci:
url/api/Comptes? q = p
Obtenez toutes les paires nom/valeur de chaîne de requête dans une variable:
IEnumerable<KeyValuePair<string, string>> queryString = request.GetQueryNameValuePairs();
Extrayez ensuite un paramètre de chaîne de requête spécifié
string value = queryString.Where(nv => nv.Key == "parameterNameGoesHere").Select(nv => nv.Value).FirstOrDefault();
si nous avons un modèle approprié pour cette demande
par exemple
public class JustModel
{
public int Id {get;set;}
public int Age {gets;set;}
}
et requête comme ça
/api/foo?id=1&Age=10
Vous pouvez simplement utiliser l'attribut [FromUri]
Par exemple
public IHttpActionResult GetAge([FromUri] JustModel model){}
Vous essayez de créer un service Web OData? Si tel est le cas, retournez simplement un IQueryable et l’API Web fera le reste.
Vous pouvez également utiliser les éléments suivants
var value = request.GetQueryNameValuePairs().Where(m => m.Key == "paramName").SingleOrDefault().Value;