ASP.NET Core MVCのWebAPIでURLクエリパラメータを取得する方法を調査したので備忘録を記載します。
下記のサイトが非常に参考になりました。
Required query string parameters in ASP.NET Core MVC
ASP.NET Core MVCの記述はASP.NET Web API 2に準拠しているらしいです。その中のAttribute Routingという機能で属性を記述することでRouteマップやアクションを定義してURLクエリパラメータをモデルバインドしてくれるそうです。ただ、ソースのどこをみてもMapHttpAttributeRoutes()が見当たらないのでどこで有効にしてるかが解りません。そもそもAttribute Routingがデフォルトで有効になっているからMapHttpAttributeRoutes()が必要ないのかもしれません、ちょっとここら辺勉強不足です。。。
とりあえずテスト用のクラスを作成して試していきましょう。
私はVS Codeで試したのでVS Codeで実施する場合、環境構築についてはこちらを参考にしてください。
URLクエリパラメータをモデルバインドするためには[Route]と[HttpGet]のAttributeをコントローラとメソッドの前に記述します。Routeにはコントローラのパスとして「api/{controller}」設定します。HttpGetには「{id}」と設定します。またメソッドの引数にはURLクエリパラメータと同じ名前の引数を用意します。
- using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; namespace SampleKokoni.Controllers { [Route("api/[controller]")] public class TestController : Controller { [HttpGet("{id}")] public String Get(int id, [FromQuery]string foo, [FromQuery]string bar) { return id + " " + foo + " " + bar; } } } -
コーディングが完了したら実行してみましょう。下記の4パターンで実行してみてください。私はVS Codeでデバッグ実行したのでURLが「http://localhost:5000/」から開始しています。
- http://localhost:5000/api/test/5
- http://localhost:5000/api/test/5?foo=aaa
- http://localhost:5000/api/test/5?bar=111
- http://localhost:5000/api/test/5?foo=aaa&bar=111
ブラウザ上にはそれぞれ下記のように出力されると思います。
- 5
- 5 aaa
- 5 111
- 5 aaa 111
URLから変数にマッピングされて表示されるのが解ると思います。URLのマッピングは下記のような構造になります。
- http://localhost:5000/{Routeで設定したパス}/{HttpGetで指定したパラメータ名}?{引数で指定したパラメータ名} ・Routeで設定したパス → api/{controller} (controllerはメソッド名のTestControllerのTestの部分) ・HttpGetで指定したパラメータ名 → HttpGetの{id}でGetメソッドの引数{int id}が対象 ・引数で指定したパラメータ名 → HttpGetの引数{[FromQuery]string foo, [FromQuery]string bar}が対象 -
[FromQuery] Attributeはなくても問題ありませんがマップされるのがURLクエリパラメータである事をコードから推察できるので記載しとくほうがいいです。
これでURLクエリパラメータを取得することが出来るようになると思います。