私はこれを尋ねるのは少し馬鹿げていると感じますが、たとえば_/api/foo?sort=name
_でgetリクエストのパラメーターを取得する方法を見つけることができません。
ApiController
クラスでは、public string Get()
を指定しました。 Get(string sort)
を指定すると、_/api/foo
_が不正な要求になります。 ApiController
のリクエストインスタンスは、タイプ_System.Net.Http.HttpRequestMessage
_です。 QueryString
またはParameters
プロパティなどはありません。
あなたはただ使うことができます
HttpContext.Current.Request.QueryString
ApiControllerは、HttpContextオブジェクトなしで動作するように設計されています(移植可能にし、IISの外部でホストできるようにします)。
クエリ文字列パラメーターには引き続きアクセスできますが、次のプロパティを使用してアクセスできます。
Request.GetQueryNameValuePairs()
すべての値をループ処理する例を次に示します。
foreach (var parameter in Request.GetQueryNameValuePairs())
{
var key = parameter.Key;
var value = parameter.Value;
}
以下は、リクエストからクエリ文字列qを取得し、それを使用してアカウントをクエリする例です。
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");
}
これは、次のように呼び出すことができます。
url/api/Accounts?q = p
すべてのクエリ文字列の名前/値のペアを変数に取得します。
IEnumerable<KeyValuePair<string, string>> queryString = request.GetQueryNameValuePairs();
次に、指定されたクエリ文字列パラメーターを抽出します
string value = queryString.Where(nv => nv.Key == "parameterNameGoesHere").Select(nv => nv.Value).FirstOrDefault();
以下を使用することもできます
var value = request.GetQueryNameValuePairs().Where(m => m.Key == "paramName").SingleOrDefault().Value;
そのリクエストに適切なモデルがある場合
例えば
public class JustModel
{
public int Id {get;set;}
public int Age {gets;set;}
}
そして、このようなクエリ
/api/foo?id=1&Age=10
[FromUri]
属性を使用できます
例えば
public IHttpActionResult GetAge([FromUri] JustModel model){}
OData Webサービスを構築しようとしていますか?その場合は、IQueryableを返すだけで、あとはWeb APIが処理します。