ASP.NET Core(.NET 6)のWebAPIでURLパラメータの受け取り方法を解説します。
FromQuery 属性
POSTやGETで呼び出されるメソッドの引数に [FromQuery] という属性パラメータを指定することでURLパラメータの値を簡単に取得することができます。
逆にURLパラメータの値などの複数の値を取得したい場合は [FromBody] という属性パラメータの方が適しています。
[FromBody] についての解説はこちらになりますので、そちらも参考にしてください。
例えば、WebAPIの以下のようなユーザログイン時のPOSTメソッドがあるとします。
ですが、現在のままではURLパラメータとして渡されるユーザIDやパスワードをWebAPI側のメソッドで受け取ることができません。
// POST: users/login?loginid=test&password=1234
[HttpPost("login")]
public async Task<ActionResult<User>> LoginUser()
{
//処理を書く
}
そういった場合に引数にユーザIDとパスワードを指定した上で、それらの変数に [FromQuery] を設定することで、
URLパラメータで渡された値が引数で指定したユーザIDとパスワードに格納されます。
ここで注意すべきは引数に設定する変数名はURLパラメータのパラメータ名と同じ(半角全角は区別しない)にする必要があるということです。
// POST: users/login?loginid=test&password=1234
[HttpPost("login")]
public async Task<ActionResult<User>> LoginUser([FromQuery] string loginid, [FromQuery] string password)
{
//処理を書く
}
FromQuery 以外の受け取り方法
FromQuery 以外にもURLパラメータの受け取り方法があります。
POSTやGETに対応するメソッドを用意するControllerには「Controller Base」が継承されていることから、
引数に FromQuery のパラメータを用意しなくてもプログラムの裏ですでに受け取ることができています。
その裏側で受け取れているURLパラメータを参照する場合、
以下のように「Request.QueryString」でURLの「?」以降のパラメータをすべて取得することができます。
ただし、パラメータを全て取得することから、複数のパラメータがある場合はそれらを分割して配列やDictionaryに格納する必要があります。
// POST: users/login?loginid=test&password=1234&loginname=testtarou
[HttpPost("login")]
public async Task<ActionResult<User>> LoginUser([FromQuery] string loginid, [FromQuery] string password)
{
//?以降のパラメータを全て取得する
//?loginid=test&password=1234&loginname=testtarou
var query = Request.QueryString;
//パラメータ分割
foreach (var key in query.Keys)
{
string value = query[key];
System.Console.WriteLine($"key={key}, value={value}");
}
}
ASP.NET おすすめ入門講座
3つのWebアプリケーションの開発を通して、ASP.NETについて基礎から学べるおすすめの入門講座がこちら☟
【入門者向け】ASP.NET MVCでWebアプリ開発のノウハウを学ぼう!