2016-12-22 11 views
3

.NETでバックエンドを設定し、基本的なHTTP呼び出しが機能しています。今はIDで検索するのではなくプロパティで検索する代替メソッドが必要です。そのため、最後に別のプロパティでREST呼び出しを行いたいと思います。 /api/{controller}/{action}/{id}:私のAPIの設定は以下のように構成されてWEB APIカスタムエンドポイント名を使用したアクション

public IHttpActionResult GetCategory(int id) 
{ 
    var category = _productService.GetCategoryById(id); 

    if (category == null) return NotFound(); 
    var dto = CategoryToDto(category); 
    return Ok(dto); 
} 


public IHttpActionResult GetCategoryByName(string name) 
{ 
    var category = _productService.GetCategoryByName(name); 

    if(category == null) return NotFound(); 
    var dto = CategoryToDto(category); 
    return Ok(dto); 
} 

:ここ

は私のコントローラの2つの方法です。

だから、最初の呼び出しは、この呼び出しで動作します。私はこの呼び出しで第二の方法をしようとすると/api/category/getcategory/2

/api/category/getcategorybyname/Jewelry

私は自分のコントローラにはアクションが要求と一致しないというエラーを取得します。

ここで問題は何ですか?

答えて

2

デフォルトのルーティング設定には、オプションint型の拘束を持つオプションのパラメータがあります。 "ジュエリー"を渡しても、その制約は満たされません。

最も簡単な修正は、アクションに対してRouteAttributeを適用し、そのようにパラメーターを指定することです。

[Route("api/category/getcategorybyname/{name}")] 
public IHttpActionResult GetCategoryByName(string name) 

あなたWebConfig.csファイルはまた、あなたのコントローラにRoutePrefix("api/category")を塗布した後Route属性からその部分をストリッピングによりRouteAttributeでアクション名を短縮することができますライン

config.MapHttpAttributeRoutes(); 

で有効なルーティング属性があることを確認してくださいアクションに。

+1

おかげで、完璧に働きました! – TanguyB

+0

エンドポイントを同じにすることもできます(もっとRESTfulに感じるでしょう)。 [Route( "api/categories/{int:id}")パラメータで型を指定すると、.NETは正しい動作を解決できます。 –

1

はルートで、あなたの第二の方法を飾るようにしてください。この名前ブラウザの呼び出しに続いて

[Route("GetCategoryByName")] 

属性。

1

また、コントローラ内のすべてのアクションに適用されますRoutePrefixルールを作成し、すべてのアクションに対して、特定のルートを適用することができます。

[RoutePrefix("api/nestedSet")] //<<====== 
public class NestedSetController : ApiController 
{ 
    [Route("myaction01")] //<<====== 
    [HttpGet] 
    public async Task<int> Myaction01_differentName() 
    { 
     //the call will be: http://mydomain/api/nestedSet/myaction01 
     //code here... 
     return 0; 
    } 


    [Route("myaction02")] //<<====== 
    [HttpGet] 
    public async Task<int> Myaction02_differentName() 
    { 
     //the call will be: http://mydomain/api/nestedSet/myaction02 
     //code here... 
     return 0; 
    } 
} 
関連する問題