ASP.NET Core MVCのWebAPIでURLクエリパラメータを取得する方法

スポンサーリンク

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/」から開始しています。

ブラウザ上にはそれぞれ下記のように出力されると思います。

  • 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クエリパラメータを取得することが出来るようになると思います。

コメント