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

投稿者: | 2017年3月5日

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

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA


このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください