3

複数のHttpGet動詞をサポートするASP.NET Core, Web APIを作成する必要がありますが、唯一の違いはクエリ文字列ですが、クエリ文字列はルートテンプレートの一部ではないようです。 - 本当?ASP.NETコア、クエリ文字列をテンプレートとするWeb API RouteAttribute

ルートテンプレートは非常に似ていますが、実際はクエリ文字列によって異なるだけです。

[Authorize] 
public class SymbolsController : Controller 
{ 
   [ 
     HttpGet, 
     Route("api/symbols") 
    ] 
   public Task<IEnumerable<Symbol>> Symbols([FromServices] ISymbolService symbolService) 
   { 
       return symbolService.GetSymbolsAsync(); 
   } 

   [ 
     HttpGet, 
     Route("api/symbols?{childrenOf=id}") 
    ] 
   public Task<IEnumerable<Symbol>> ValidChildren(
     [FromQuery] Guid id, 
       [FromServices] ISymbolService symbolService) 
   { 
       return symbolService.GetValidChildrenAsync(id); 
   } 
} 

?がルートテンプレートの有効な文字ではないため、例外がスローされます。どうすればこれを達成できますか?

答えて

4

私は、より簡単でより簡単な解決法を見つけました。私は単純にFromQuery属性を使い、テンプレートを単純なままにしています。私はid変数の存在をチェックし、それに応じてそれを処理します。

[HttpGet, Route("api/symbols")] 
public Task<IEnumerable<Symbol>> Symbols(
    [FromQuery] Guid id, 
    [FromServices] ISymbolService symbolService) 
{ 
    return id == default(Guid) 
       ? symbolService.GetSymbolsAsync() 
       : symbolService.GetValidChildrenAsync(id); 
} 
+0

複雑なオブジェクトに[FromUri]を使用できます。 –

1
//eg GET api/symbols 
//eg GET api/symbols?childrenOf={someGuid} 
[HttpGet("api/symbols")] 
public Task<IEnumerable<Symbol>> Symbols(
    [FromServices] ISymbolService symbolService, 
    Guid? childrenOf = null) 
{ 
    if (childredOf.HasValue) { 
     return ValidChildren(childredOf.Value, symbolService); 
    } 
    return symbolService.GetSymbolsAsync(); 
} 

Task<IEnumerable<Symbol>> ValidChildren(
    Guid id, 
    ISymbolService symbolService) 
{ 
    return symbolService.GetValidChildrenAsync(id); 
} 
関連する問題