誰かがCreatedAtRoute()を私に説明できますか?


136

Web API 2のテンプレートから、postメソッドは常に次のようになります。

[ResponseType(typeof(MyDTO))]
public IHttpActionResult PostmyObject(MyDTO myObject)
{
    ...
    return CreatedAtRoute("DefaultApi", new { id = myObject.Id }, myObject);
}

私はこのCreatedAtRoute()方法を理解していません。誰かCreatedAtRoute()が私に方法を説明できますか?


25
@JohnSaundersもちろん、これらのGoogleの結果を見つけました。私の問題は、これらのドキュメントがこの方法を理解するのに役立たないことです。だから私はここで尋ねます。
武道

11
その時は私の質問に答えてはいけません。
武道

12
Googleで答えを見つけることができる場合、なぜ時間をかけて質問を編集してここで質問するのですか?
武道

3
この質問をしてくれてありがとう:)
Vidar

回答:


157

CreatedAtRouteメソッドは、POSTメソッドを呼び出して新しいオブジェクトを格納するときに、新しく作成されたリソースにURIを返すことを目的としています。たとえば、注文アイテムをPOSTすると、「api / order / 11」のようなルートが返される可能性があります(11は注文のIDです)。

ところで、MSDNの記事がこれを理解する上で役に立たないことに同意します。実際に戻るルートは、ルーティングの設定によって異なります。


13
実際に返されるのは、CreatedAtRouteNegotiatedContentResult <myObject>オブジェクトです。これは、アクションでユニットテストを実行すると表示されます。ただし、httpのコンテキストで実行すると、本文にシリアル化されたオブジェクトが返されますが、リソースへのリンクを含む応答のヘッダーが表示されます。ところで私が質問に答えたと思うなら、答えとしてマークしてもらえますか?乾杯。
2014

3
ありがとう、これが私の質問に答えます。
武道

2
指定したルートは、応答のLocationヘッダーとして表示されます。これはかなり典型的なRESTの動作です
Jeff Martin

4
@seesharper MyObjectが返されない場合BUT ...なぜCreatedAtRouteに渡さなければならないのですか?それを使った方法は何ですか?
エリザベス

6
現在のルートを使用する方法はありますか?たとえば、[Route("[controller]")]on controllerを使用してファイルコントローラーにオブジェクトを作成すると、何が返されますか(たとえば、隣接するGETアクションをURLで呼び出すことができます)?
Shimmy Weitzhandler

17

CreatedAtRouteを使用する場合、最初の引数はリソースへのGetのメソッド名です。それほど明白ではないトリックは、正しいメソッド名が指定されていても、機能するためにはHttpGet属性でNameパラメーターを使用する必要があるということです。

だからあなたの投稿のリターンがこれなら:

return CreatedAtRoute("Get", new { newModel.Id}, newModel);

メソッドがGetという名前であっても、Getメソッド属性は次のようになります。

[HttpGet("{id}", Name = "Get")]

Postメソッドを呼び出すと、新しいオブジェクト(通常はJSONとして)が返されるだけでなく、そのリソースを取得するURIへの応答にLocationヘッダーが設定されます。


「これは新しいオブジェクト(通常はJSONとして)を返すだけでなく、そのリソースを取得するURIへの応答にLocationヘッダーを設定します。」「これ」とは、HttpGetまたはHttpPostを意味しますか?また、「そのリソースを取得するURIへの応答にLocationヘッダーを設定する」とはどういう意味ですか?
Tran Anh Minh

「これ」はHttpPostメソッドを指していました(回答を編集してください)。Locationヘッダーに関する質問については、クライアントが自動的にリダイレクトするなどの処理をクライアントが決定できるHttpヘッダーです。これは標準のHttp応答ヘッダー(en.wikipedia.org/wiki/…)です。
Scott Blasingame

回答を更新して、2番目と3番目のパラメータの意味も含めてください。
変数

0

.netコアWebAPIでは、このメソッドを使用して201コードを返します。これは、オブジェクトが作成されたことを意味します。

[Microsoft.AspNetCore.Mvc.NonAction]
public virtual Microsoft.AspNetCore.Mvc.CreatedAtRouteResult CreatedAtRoute (string routeName, object routeValues, object content);

上記のように、CreatedAtRouteは3つのパラメーターを受け取ることができます。

routeName は、作成後にリソースを取得するURIになるメソッドに付ける必要がある名前です。

routeValues 名前付きルートでGETメソッドに渡される値を含むオブジェクトです。作成されたオブジェクトを返すために使用されます

content 作成されたオブジェクトです。

上記の例は、結合された名前を持つ単純なGETメソッドと、新しいオブジェクトを作成するPOSTメソッドを使用した、単純なコントローラーの2つのメソッドの実装を示しています。

namespace BastterAPI.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class CompanyController : Controller
    {
        private ICompanyRepository _companyRepository;

        public CompanyController(ICompanyRepository companyRepository)
        {
            _companyRepository = companyRepository;
        }

        [HttpGet("{id}", Name="GetCompany")]
        public IActionResult GetById(int id)
        {
            Company company = _companyRepository.Find(id);

            if (company == null)
            {
                return NotFound();
            }

            return new ObjectResult(company);

        }

        [HttpPost]
        public IActionResult Create([FromBody] Company company)
        {

            if (company == null)
            {
                return BadRequest();
            }

            _companyRepository.Add(company);

            return CreatedAtRoute("GetCompany", new Company { CompanyID = company.CompanyID }, company);

        }


    }
}

重要

  1. CreatedAtRoute(routeName)の最初のパラメーターは、GetメソッドでのNameの定義と同じでなければならないことに注意してください。

  2. 2番目のパラメーターのオブジェクトには、Getメソッドでリソースを取得するために使用する必要なフィールドが必要です。これは、それ自体が作成されたオブジェクトのサブセットであると言えます

  3. 最後のパラメーターは、本文リクエストで受信された会社オブジェクトで、完全な形式です。

最終

最終的に、新しいAPIを作成するための投稿がこのAPIに対して行われると、新しく作成されたリソースに戻る「api / company / {id}」のようなルートが返されます

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.