Adakah yang bisa menjelaskan CreatedAtRoute () kepada saya?

136

Dari template untuk Web API 2, metode posting selalu seperti ini:

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

Saya tidak mengerti CreatedAtRoute()metode ini . Adakah yang bisa menjelaskan CreatedAtRoute()metode ini kepada saya?

bela diri
sumber
25
@ JohnSaunders tentu saja saya menemukan hasil Google itu. Masalah saya adalah bahwa dokumen-dokumen ini tidak membantu saya memahami metode ini, setelah membacanya, saya masih tidak mengerti. Itu sebabnya saya bertanya di sini.
bela diri
11
Saya tidak ingin Anda menjawab pertanyaan saya.
bela diri
12
Jika saya dapat Google dan menemukan jawaban, mengapa saya repot-repot menghabiskan waktu untuk mengedit pertanyaan dan bertanya di sini?
bela diri
3
terima kasih telah mengajukan pertanyaan ini :)
Vidar

Jawaban:

157

The CreatedAtRouteMetode ini dimaksudkan untuk mengembalikan URI untuk sumber daya baru dibuat ketika Anda memanggil metode POST untuk menyimpan beberapa objek baru. Jadi, jika Anda POST item pesanan misalnya, Anda mungkin mengembalikan rute seperti 'api / order / 11' (11 menjadi id pesanan jelas).

BTW Saya setuju bahwa artikel MSDN tidak ada gunanya memahami hal ini. Rute yang Anda kembalikan sebenarnya akan tergantung pada pengaturan perutean Anda.

lihat lebih tajam
sumber
13
Apa yang dikembalikannya sebenarnya adalah objek <myObject> CreatedAtRouteNegotiatedContentResult! Itulah yang akan Anda lihat jika Anda menjalankan tes unit pada tindakan Anda. Namun ketika dijalankan dalam konteks http, itu akan mengembalikan objek berseri dalam tubuh, tetapi Anda akan melihat header dalam respons dengan tautan ke sumber daya. BTW jika Anda pikir saya menjawab pertanyaan, dapatkah Anda menandai sebagai jawaban? Bersulang.
Lihat lebih tajam
3
Terima kasih, ini menjawab pertanyaanku.
bela diri
2
Rute yang Anda berikan muncul sebagai tajuk Lokasi di respons. Ini adalah perilaku REST yang cukup khas
Jeff Martin
4
@ seesharper Ketika MyObject tidak dikembalikan NAMUN ... mengapa saya harus meneruskannya ke CreatedAtRoute? Apa yang dilakukan metode dengan itu?
Elisabeth
6
Apakah ada cara untuk menggunakan rute saat ini? Misalnya, jika saya membuat objek di pengontrol file menggunakan [Route("[controller]")]pada pengontrol, apa yang harus saya kembalikan (sehingga tindakan GET yang berdekatan dapat dipanggil dengan URL, misalnya)?
Shimmy Weitzhandler
17

Saat Anda menggunakan CreatedAtRoute, argumen pertama adalah nama metode Get to the resource. Trik yang tidak begitu jelas adalah bahwa, bahkan dengan nama metode yang ditentukan, Anda harus menggunakan param Nama pada atribut HttpGet agar dapat berfungsi.

Jadi jika pengembalian dalam Posting Anda adalah ini:

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

Maka atribut Get method Anda akan terlihat seperti ini bahkan jika metode Anda bernama Get:

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

Panggilan ke metode Posting Anda tidak hanya akan mengembalikan objek baru (biasanya sebagai JSON), itu akan mengatur header Lokasi pada respons terhadap URI yang akan mendapatkan sumber daya itu.

Scott Blasingame
sumber
"Ini tidak hanya akan mengembalikan objek baru (biasanya sebagai JSON), itu akan mengatur header Lokasi pada respons terhadap URI yang akan mendapatkan sumber daya itu." Dengan "Ini", maksud Anda HttpGet atau HttpPost? Juga, apa yang Anda maksud dengan "itu akan mengatur header Lokasi pada respons terhadap URI yang akan mendapatkan sumber daya itu."?
Tran Anh Minh
"Ini" merujuk ke metode HttpPost (edit jawabannya). Mengenai pertanyaan Anda tentang header Lokasi, itu adalah Http Header yang klien dapat putuskan untuk melakukan sesuatu dengan seperti secara otomatis mengarahkan ulang ke sana. Ini adalah Header Respons Http standar ( en.wikipedia.org/wiki/… ).
Scott Blasingame
Harap Anda dapat memperbarui jawaban Anda untuk memasukkan arti param 2 dan 3 juga.
variabel
0

Di .net core WebAPI, Anda menggunakan metode ini untuk mengembalikan kode 201, yang berarti bahwa objek itu dibuat.

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

Seperti yang Anda lihat di atas, CreatedAtRoute dapat menerima 3 parameter:

routeName Adalah nama yang harus Anda masukkan pada metode yang akan menjadi URI yang akan mendapatkan sumber daya itu setelah dibuat.

routeValues Ini adalah objek yang berisi nilai-nilai yang akan diteruskan ke metode GET pada rute bernama. Ini akan digunakan untuk mengembalikan objek yang dibuat

konten Itu objek yang telah dibuat.

Contoh di atas menunjukkan implementasi dua metode pengontrol sederhana dengan metode GET sederhana dengan nama berikat dan metode POST yang membuat objek baru.

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);

        }


    }
}

PENTING

  1. Perhatikan bahwa parameter pertama di CreatedAtRoute (routeName), harus sama dengan definisi Name at the Get method.

  2. Objek pada parameter kedua harus memiliki bidang yang diperlukan yang Anda gunakan untuk mengambil sumber daya pada metode Get, Anda dapat mengatakan bahwa itu adalah subset dari objek yang dibuat sendiri.

  3. Parameter terakhir adalah objek perusahaan yang diterima dalam permintaan tubuh dalam bentuk lengkapnya.

AKHIRNYA

Sebagai hasil akhir, ketika Post untuk membuat perusahaan baru dibuat ke API ini, Anda akan mengembalikan rute seperti 'api / company / {id}' yang akan mengembalikan kepada Anda sumber daya yang baru dibuat

Bruno Bastos
sumber