[ASP.NET]クエリパラメータとパスパラメータのルーティング設定[WebAPI]

ASP.NET

こんにちは。「たまり醬油に冷奴」ことやっこです。

前回の「ルーティング設定」にて調査した中で少し気になったクエリパラメータ、パスパラメータについて調べた内容をまとめます。

環境

  • Visual Studio 2022
  • ASP.NET 4.8.1

クエリパラメータ、パスパラメータ

見た目の違いは↓のような感じ(※paramがクエリとして渡す値)

http://example.com/api/hoge/gethoge?query1=param1&query2=param2  //クエリパラメータ

Example Domain
//パスパラメータ

見た目が違うのみで内容は特に変わらないかと思いますが、内部でのルーティング設定は異なります。

ルーティング設定

クエリパラメータ

クエリパラメータのルーティング設定は特に気にしなくてよいです。

「WebApiConfig.cs」と「ValuesController.cs」のロジックを記載します。

// WebApiConfig.cs
config.Routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}",
    defaults: new { }
);

デフォルトだと4行目に「routeTemplate: “api/{controller}/{id}”,」が書かれていますが、今回クエリパラメータの説明のために{id}を削除しています。

public class ValuesController : ApiController
    {
    public IEnumerable<string> Get()
        {
        return new string[] { "value1", "value2" };
        }

    public string Get(int id)
        {
        return "value";
        }

  public string Get(string hoge)
        {
            return "hoge";
        }
    }

上記では3つのGetメソッドを設定しています。

上から順に呼び出すためのリクエストURLは下記のようになります。

http://example.com/api/values           //返却値 { "value1", "value2" }

Example Domain
{param}  //返却値 "value"
Example Domain
{param} //返却値 "hoge"

要はリクエストURL内に変数(上記で言う、”id”や”hoge”)が設定されている場合は、その変数名を引数としているGetメソッド呼び出しています。

※変数名が一致するメソッドがない場合、例えば”?hogehoge=”などその変数を必要とするメソッドがない場合は、引数の必要ないGetメソッド(上記でいう”http://example.com/api/values”)と認識されます。

パスパラメータ

クエリパラメータと違いパスパラメータでは「WebApiConfig.cs」にて設定が必要になります。

// WebApiConfig.cs
config.Routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{id}",
    defaults: new { id = RouteParameter.Optional }
);

デフォルトで上記のようになっているかと思います。4行目にてリクエストURLで{controller}の後は{id}の値と認識するように設定されます。

5行目では{id}に値がない場合のデフォルト値を設定しています。

public class ValuesController : ApiController
    {
    public IEnumerable<string> Get()
        {
        return new string[] { "value1", "value2" };
        }

    public string Get(int id)
        {
        return "value";
        }

  public string Get(string hoge)
        {
            return "hoge";
        }
    }

上記では3つのGetメソッドを設定しています。(クエリパラメータ説明時と同じ)

クエリパラメータと同様に3つのメソッドを呼び出そうとリクエストURLを叩いてみます。

http://example.com/api/values    //返却値 { "value1", "value2" }

Example Domain
   //返却値 "value"
Example Domain
  //返却値 エラー ※int型ではないのでエラーが発生
Example Domain
//返却値 "value" クエリパラメータも一応使えます

“values”の後の値を”id”の値として認識しています。なので引数が”hoge”のGetメソッドを呼び出すことは出来なくなります。

同じメソッド名で引数違いのAPIは呼べないようです。たぶん。。。。

まとめ

上記を見るとパスパラメータはルーティング設定も必要だし、制限もあるしと思えますが、”id”などの変数名が見えてしまうことで起こりうる問題もありそうです。

Googleの検索などはクエリパラメータですけど、見えているのは自分が入力した文字なので見えてよいでしょうね。

変数名からどういった情報なのかを判断するのは容易ですから、その情報が見えても問題ないなどであればクエリパラメータでよい気がします。

ちなみに、今回の例ではすべてGetというメソッドを配置してましたが、本来はGetCompanyなどように何をどうするが分かるようなメソッド名を指定して”~/api/values/getcompany”とする方法が私は良いかと思います。