2017-12-22 26 views
3

私のapiを消費者に新しく作成されたオブジェクトの場所について知らせたいと思います。私はCreated()CreatedAtRoute()CreatedAtAction()があることを知っていますが、私はそれを使用する方法がわかりません。asp net core apiでCreated(またはCreatedAtAction/CreatedAtRoute)を使用する方法

を私が指し示すしたい先の取得リソースを持っている:ここでは

は、私が試したものです。これは、入力としてIDを取ります。

[HttpGet("/${id}", Name = "GetProduct")] 
    [ProducesResponseType(typeof(Produkt), 200)] 
    public IActionResult Get([FromRoute] int id) 
    { 
     // some code... 
     return Ok(...); 
    } 

製品は私のPOST経路を経て作成されたとき、私はLocationヘッダを経由して、このリソースを指し示すしたいと思います:

試み1

[HttpPost] 
    [ProducesResponseType(typeof(Produkt), 200)] 
    public IActionResult CreateNewProduct([FromBody] ProduktDtoForCreate productFromBody) 
    { 
     //... 
     return CreatedAtRoute("GetProduct", new { id = productToCreate.Id }, productToCreate); 
    } 

ロケーションヘッダーhttp://localhost:5000/ $ 15003

試みこの1作品と/api/v1.0/produkte/16004を返しますが、それはすべきではない、新しい場所を指すように、現在の要求を使用してのように思える2

[HttpPost] 
    [ProducesResponseType(typeof(Produkt), 200)] 
    public IActionResult CreateNewProduct([FromBody] ProduktDtoForCreate productFromBody) 
    { 
     //... 
     return Created(new Uri($"{Request.Path}/{productToCreate.Id}", UriKind.Relative), productToCreate); 
    } 

必要です。これが良い練習であるかどうかもわかりません。

ありがとうございました。

答えて

1

Getメソッドのルートで/と$ outの両方を使用してください(つまり、 "{id}"にする必要があります)。先頭に/ inがあるということは、ルートがアプリケーションのベースに対して相対的であることを意味します。これを取り出すと、代わりにコントローラのベースパスを基準にしたメソッドのルートが作成されます。 $は経路上のリテラル文字として扱われています。なぜそれがAttempt 1のLocationヘッダーに表示されていたのでしょうか?変更を行ったら、CreatedAtRoute呼び出しが期待通りに機能することがわかります。

+1

また、CreateNewProductメソッドのProducesResponseType注釈に、200ではなく201の戻りコードを指定する必要があります。 –

+0

ありがとう、Graham!私はCreatedAtメソッドにとても集中していました。私はGetメソッドでばかげたミスを犯しました:)素晴らしい2018年 – Riscie

関連する問題