2016-08-03 15 views
4

私は次のように私は3つのgetメソッドを持っている必要があります1つのリソース教材を持っているWeb APIを構築しています:は、ASP.NETコアウェブAPIで複数のクエリ文字列パラメータを持つ複数の取得・メソッドを持つ

[HttpGet] 
    [Route("{city}/{streetName}/{streetNumber}/{littera}")] 
    public IActionResult GetByAddress([FromQuery]string city, [FromQuery]string streetName, [FromQuery]int streetNumber, [FromQuery]string littera) 
    { 
     var model = _availabilityService.FindByAddress(city, streetName, streetNumber, littera); 
     return Ok(model); 
    } 

    [HttpGet("{pointId}")] 
    public IActionResult GetByPointId(string pointId) 
    { 
     var model = _availabilityService.FindByPointId(pointId); 
     return Ok(model); 
    } 

    [HttpGet] 
    [Route("{xCoordinate}/{yCoordinate}")] 
    public IActionResult GetByCoordinates([FromQuery]decimal xCoordinate, [FromQuery]decimal yCoordinate) 
    { 
     var model = _availabilityService.FindByCoordinates(xCoordinate, yCoordinate); 
     return Ok(model); 
    } 

GETをメソッドが1つのパラメータ(pointId)だけを持つメソッドは、クエリ文字列ではなくむしろidであるため、正常に動作しています。しかし、残りの2つの方法は、ASP.NETのルータで区別できないようです。

私は本当にここに迷っており、なぜ動作しないのか理解できません。私が解決することができたのは、もし私がそのメソッドの1つを削除すれば、もう1つはうまく動作するということです。

私が間違っていることに関する提案はありますか? FYI

、対応するURL:Sは次のようになりべき:

api/1.0/availabilities?city=Metropolis&streetName=Superstreet&streetNumber=1&littera=A 

/api/1.0/availabilities?xCoordinate=34.3444&yCoordinate=66.3422 

ありがとう!

+0

あなたはそれが機能していないと言うとき、正確に何か別の2つのアクションを呼び出すことで取得できますか? 404? – jpgrassi

+0

@jpgrassi:私はちょうど500の内部サーバーエラーを取得しています。私はデバッガを使用しましたが、エンドポイントが決して到達しないということが起こります。結論として、私のルーティングは混乱し混乱しています。 :( –

答えて

9

まず、RouteParametersとQueryParametersを混合しています。

この:

[HttpGet] 
[Route("{xCoordinate}/{yCoordinate}")] 
public IActionResult GetByCoordinates([FromQuery]decimal xCoordinate, [FromQuery]decimal yCoordinate) 
{ 
    var model = _availabilityService.FindByCoordinates(xCoordinate, yCoordinate); 
    return Ok(model); 
} 

は、このようなルートにコントローラのアクションGetByCoordinatesマッピングします

/api/1.0/availabilities/34.3444/66.3422 

をしかし、あなたはまた、あなたがクエリパラメータから拘束されることにxCoordinateyCoordinateを期待しているように指定されています。したがって、上記のURLはアクションに一致しますが、xCoordinateyCoordinateはデフォルト値(この場合は0)にバインドされます。

だからあなたの希望のルートを取得するには、ルート・パラメータを宣言しないでください。

[HttpGet] 
[Route("")] // <- no route parameters specified 
public IActionResult GetByCoordinates([FromQuery]decimal xCoordinate, [FromQuery]decimal yCoordinate) 
{ 
    // will be matched by e.g. 
    // /api/1.0/availabilities?xCoordinate=34.3444&yCoordinate=66.3422 
} 

今すぐご希望のルートが一致します。

注:同じルートに2つのアクションをマップすることはできません。ルートミドルウェアはどちらを選択するかを知りません。だから、またGetByAddressからルートパラメータを削除すると、効果的に同じルートに両方のアクションをマップします:

/api/1.0/availabilities?{any=number&of=query&parameters=here} 

だから、例えば、別の経路セグメントによってそれらを区別する必要があります。

[HttpGet] 
[Route("address")] // <-- 
public IActionResult GetByAddress([FromQuery]string city, [FromQuery]string streetName, [FromQuery]int streetNumber, [FromQuery]string littera) 
{ 
    // will be matched by e.g. 
    // api/1.0/availabilities/address?city=Metropolis&streetName=Superstreet&streetNumber=1&littera=A 
} 

さらにリーディング:

ModelBinding/Routing

クイックヒント:標準ASPで発生appsettings.json(自動でDebugから

Microsft

セットログレベル。Net Core WebApplication Template)、kestrelで実行しているときに、コンソール出力の経路選択中に経路選択/エラーに関する非常に有益な情報が得られます。 LogLevel.Debug

{ 
    "Logging": { 
    "IncludeScopes": false, 
    "LogLevel": { 
    "Default": "Debug", 
    "System": "Information", 
    "Microsoft": "Debug" 
} 

それともStartUp.csにデバッグロガーを設定して、あなたは、Visual Studioで直接デバッグ出力に同じ情報を取得します。

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) 
    { 
     // ... 

     loggerFactory.AddDebug(LogLevel.Debug); 

     // ... 
    } 
+0

良いexplanaition.Itありがとうあなたは何を記述している意味があります。これは新しい質問を課すが、その意味を指定するためにリソースの "ルーティングワード"を追加する従来の方法ですか?答えをありがとう、私はそれが答えたとマークしました!:) –

+0

@ KasperP私の意見では、apiを設計するときにあなたに最も適しています。それは、特にあなたがコンベンションについて尋ねているように、RESTはあなたが(試みる)ことができるようなコンベンション/パラダイムになると言いました。 GetByAddressとGetByCoordinatesを1つの検索アクションにマージするのはおそらくそうであるようです。 [REST](http://stackoverflow.com/questions/671118/what-exactly-is-restful-programming?rq=1)、[URI-Design](http://stackoverflow.com/questions/1619152/how -z-rest-urls-without-verbs/1619677#1619677) – ypsilo0n

+0

ありがとうございます。 –