MapGetで作成したエンドポイントでURLのルーティング パラメーターを取得する
MapGetで作成したエンドポイントでURLのルーティング パラメーターを取得するコードを紹介します。
概要
こちらの記事ではMapGetメソッドを利用してシンプルなエンドポイントを作成しましたが、MapGetで作成したエンドポイントで、URLパラメーターを取得することもできます。パラメーターを取得するにはパラメーターが含まれたURLパターンをMapGetのパターンに与えてURLを受け取れる状態にします。処理部分では、HttpContextのGetRouteValue()メソッドを呼び出すことでURLのパラメーターを取得できます。
ただし、デフォルトの雛型のコードでは、GetRouteValueメソッドの呼び出しができないため、usingに
using Microsoft.AspNetCore.Routing;
を追記する必要があります。
プログラム例
事前準備
ASP.NET Core Webアプリケーションプロジェクトを作成します。手順は
こちらの記事を参照してください。
コード
下記のコードを記述します。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.AspNetCore.Routing; //この行を追加!
namespace RootingEndpoint
{
public class Startup
{
// This method gets called by the runtime. Use this method to add services to the container.
// For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
public void ConfigureServices(IServiceCollection services)
{
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment()) {
app.UseDeveloperExceptionPage();
}
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapGet("/view/{query}", async context =>
{
string paramstr = (string)context.GetRouteValue("query");
await context.Response.WriteAsync("Hello ASP.NET Core World EndPoint!:"+paramstr);
});
});
}
}
}
解説
ルーティングのコードに関しては
こちらの記事を参照してください。
app.UseRouting();
app.UseEndpoints(endpoints =>
{
// ...中略...
});
エンドポイントの記述が下記のコードになります。MapGetメソッドのパターンに
/view/{query}
を与えていますので、
(アプリケーションルートURL)/view/(パラメータ値)
のURLをこのエンドポイントでは処理できます。
処理部分では、GetRouteValue() メソッドを呼び出し、URLの{query}パラメーター部の値を取得します。"Hello ASP.NET Core World EndPoint!:"
のメッセージと取得した値をレスポンスとして返します。
endpoints.MapGet("/view/{query}", async context =>
{
string paramstr = (string)context.GetRouteValue("query");
await context.Response.WriteAsync("Hello ASP.NET Core World EndPoint!:"+paramstr);
});
実行結果
プロジェクトを実行し、
(アプリケーションルートURL)/view/penta
のURLにアクセスします。"Hello ASP.NET Core World EndPoint!" のメッセージとURLに入力したパラメーターの値 "penta" がページに表示されていることが確認できます。
パラメーター部分を "AhiRun" に変更してアクセスしてみます。ページの表示内容も変化することが確認できます。
(アプリケーションルートURL)/view/
のURLにアクセスした場合は、パターンにマッチしないため、Not Foundのエラーが表示されます。
参考 : パラメーターが指定されなかった場合でもMapGetの処理を実行したい場合
先のコードでは
(アプリケーションルートURL)/view/
のURLにアクセスした場合は、パターンにマッチしないため、Not Foundのエラーが表示されましたが、パラメータが無くても処理をした場合があります。パラメーターが無い場合でもマッチさせる場合は下記の書式を利用します。
先のコードのConfigureを下記のコードに変更します。
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment()) {
app.UseDeveloperExceptionPage();
}
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapGet("/view/{query?}", async context =>
{
string paramstr = (string)context.GetRouteValue("query");
await context.Response.WriteAsync("Hello ASP.NET Core World EndPoint!:"+paramstr);
});
});
}
解説
MapGetメソッドに与えるパターンを "/view/{query?}" に変更しました。
{query?}
部分に?が追加されたことでパラメータが無い場合もマッチする動作になります。
実行結果
プロジェクトを実行します。Webブラウザで
(アプリケーションルートURL)/view/
のURLにアクセスします。先のコードと違いNoe Foundエラーは発生せず、MapGetの処理が実行されます。
著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用