2つのgetメソッドを使用してasp.netwebapiを作成しています。 1つはすべてのレコードを返し、もう1つは国コードと呼ばれる文字列パラメータに基づいてフィルタリングする必要があります。文字列パラメータを指定したgetメソッドが呼び出されない理由がわかりません。
次のURIを試してみました
http://localhost:64389/api/team/'GB'
http://localhost:64389/api/team/GB
以下は私のコードです
Web API
public HttpResponseMessage Get()
{
var teams = _teamServices.GetTeam();
if (teams != null)
{
var teamEntities = teams as List<TeamDto> ?? teams.ToList();
if (teamEntities.Any())
return Request.CreateResponse(HttpStatusCode.OK, teamEntities);
}
return Request.CreateErrorResponse(HttpStatusCode.NotFound, "Team not found");
}
public HttpResponseMessage Get(string countryCode)
{
if (countryCode != null)
{
var team = _teamServices.GetTeamById(countryCode);
if (team != null)
return Request.CreateResponse(HttpStatusCode.OK, team);
}
throw new Exception();
}
WebAPIConfig
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// Web API configuration and services
// Configure Web API to use only bearer token authentication.
config.SuppressDefaultHostAuthentication();
config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType));
// Web API routes
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
config.Formatters.JsonFormatter.SupportedMediaTypes
.Add(new MediaTypeHeaderValue("text/html"));
}
}
おそらく、デフォルトのAPIルートからデフォルトの「Get()」メソッドにアクセスしていると思います。
このようにメソッドでパラメーター名を「id」に変更した場合も機能すると思います。
public HttpResponseMessage Get(string id)
これは、デフォルトルートのオプションのパラメータ名が「id」であるためです。
属性ルーティングを機能させるには、以前にルート構成によって推測された値でコントローラーとメソッドを装飾する必要があります。
したがって、コントローラーの上部には、おそらく次のものがあります。
[RoutePrefix("api/team")]
public class TeamController : ApiController
次に、2番目のgetメソッドの上に:
[Route("{countryCode}")]
public HttpResponseMessage Get(string countryCode)
属性ルーティング以来、私は「古いスタイル」のルーティングを使用していません。
詳細については、 属性ルーティングに関するASP.NETページ を確認してください。
コメント用に編集:
同じパラメータを持つ2つのルートがある場合は、ルート内でそれらを何らかの方法で区別する必要があります。したがって、チーム名で取得する例として、私はおそらく次のようなことをします。
[HttpGet()]
[Route("byTeamName/{teamName}")]
public HttpResponseMessage GetByTeamName(string teamName)
Your url would then be /api/team/byTeamName/...
他のメソッド名は「Get」であり、デフォルトのHTTP属性ルーティングはHTTP動詞と同じメソッド名を検索します。ただし、メソッドに好きな名前を付けて、代わりに動詞で装飾することができます。