CreatedAtRoute () öğesini bana açıklayan var mı?


136

Web API 2 şablonundan bir gönderi yöntemi her zaman şu şekildedir:

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

Bu CreatedAtRoute()yöntemi anlamıyorum . Biri CreatedAtRoute()bana yöntemi açıklayabilir mi?


25
@JohnSaunders tabii ki o Google sonuçlarını buldum. Benim sorunum, bu belgelerin bu yöntemi anlamama yardımcı olmaması, onları okuduktan sonra hala anlamıyorum. Bu yüzden burada soruyorum.
askeri

11
O zaman soruma cevap vermeni istemiyorum.
dövüş

12
Google'ı bulabilir ve yanıt bulabilirsem, neden soruyu düzenlemek ve burada sormak için zaman harcayayım?
askeri

3
bu soruyu sorduğunuz için teşekkürler :)
Vidar

Yanıtlar:


157

CreatedAtRouteYöntem bazı yeni nesneyi saklamak için bir POST yöntemini çağırdığınızda yeni oluşturulan kaynağın bir URI dönmek için tasarlanmıştır. Bu nedenle, örneğin bir sipariş öğesini POST olarak gönderirseniz, 'api / order / 11' gibi bir rota döndürebilirsiniz (11, açıkça siparişin kimliğidir).

BTW MSDN makalesinin bunu anlamada bir faydası olmadığını kabul ediyorum. Gerçekte döndüğünüz rota, doğal olarak yönlendirme ayarlarınıza bağlı olacaktır.


13
Döndürdüğü şey aslında bir CreatedAtRouteNegotiatedContentResult <myObject> nesnesidir! Eyleminiz üzerinde bir birim testi çalıştırırsanız göreceğiniz şey budur. Bununla birlikte, http bağlamında çalıştırıldığında, gövdede serileştirilmiş nesneyi döndürür, ancak yanıtta kaynağa bağlantı içeren bir başlık görmelisiniz. BTW, soruyu cevapladığımı düşünüyorsanız, cevap olarak işaretleyebilir misiniz? Şerefe.
daha keskin görün

3
Teşekkür ederim, bu sorumu cevapladı.
dövüş

2
Sağladığınız yol, yanıtta Konum başlığı olarak görünür. Bu oldukça tipik bir DİNLENME davranışı
Jeff Martin

4
@seesharper MyObject döndürülmediğinde ANCAK ... neden onu CreatedAtRoute'a iletmem gerekiyor? Yöntem bununla ne yapıyor?
Elisabeth

6
Mevcut rotayı kullanmanın bir yolu var mı? Örneğin, denetleyicide kullanarak dosya denetleyicisinde bir nesne oluşturursam [Route("[controller]")], ne döndürürüm (örneğin, bitişik GET eylemi URL ile çağrılabilir)?
Shimmy Weitzhandler

17

CreatedAtRoute'u kullandığınızda, ilk bağımsız değişken, Kaynağa Getir seçeneğinin yöntem adıdır. Bu kadar açık olmayan hile, doğru yöntem adı belirtilmiş olsa bile, çalışması için HttpGet özniteliğindeki Ad parametresini kullanmanız gerektiğidir.

Yani Gönderinizdeki geri dönüş şuysa:

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

Daha sonra, yönteminiz Get olarak adlandırılsa bile Get yöntemi özniteliğiniz şöyle görünmelidir:

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

Gönderi yönteminize yapılan çağrılar yalnızca yeni nesneyi (normalde JSON olarak) döndürmekle kalmaz, aynı zamanda bu kaynağı alacak olan URI'ye verilen yanıtta Konum başlığını da ayarlar.


"Bu yalnızca yeni nesneyi (normalde JSON olarak) döndürmekle kalmaz, aynı zamanda bu kaynağı alacak URI'ye verilen yanıtta Location başlığını da ayarlayacaktır." "Bu" ile, HttpGet veya HttpPost'u mu kastediyorsunuz? Ayrıca, "Bu, kaynağı alacak URI'ye verilen yanıtta Konum başlığını ayarlayacaktır" ile ne demek istiyorsun?
Tran Anh Minh

"Bu", HttpPost yöntemine atıfta bulunuyordu (yanıtı düzenleyin). Konum başlığıyla ilgili sorunuza gelince, bu, istemcinin otomatik olarak ona yönlendirmek gibi bir şey yapmaya karar verebileceği bir Http Başlığıdır. Bu standart bir Http Yanıt Başlığı'dır ( en.wikipedia.org/wiki/… ).
Scott Blasingame

Lütfen cevabınızı 2. ve 3. parametrenin anlamını da içerecek şekilde güncelleyebilirsiniz.
değişken

0

.Net çekirdek WebAPI'sinde, bu yöntemi bir 201 kodu döndürmek için kullanırsınız, bu, nesnenin oluşturulduğu anlamına gelir.

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

Yukarıda görebileceğiniz gibi, CreatedAtRoute 3 parametre alabilir:

routeName , oluşturulduktan sonra o kaynağı alacak olan URI olacak yönteme koymanız gereken addır.

routeValues Adlandırılmış rotada GET yöntemine iletilecek değerleri içeren nesnedir. Oluşturulan nesneyi döndürmek için kullanılacak

içerik Yaratılan nesnedir.

Yukarıdaki örnek, bağlı adla basit bir GET yöntemiyle basit bir denetleyicinin iki yönteminin ve yeni bir nesne oluşturan POST yönteminin uygulanmasını gösterir.

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

        }


    }
}

ÖNEMLİ

  1. CreatedAtRoute'daki (routeName) ilk parametrenin Get yöntemindeki Ad tanımında aynı olması gerektiğine dikkat edin.

  2. İkinci parametredeki nesnenin, kaynağı Get yönteminde almak için kullandığınız gerekli alanlara sahip olması gerekir, bunun kendi yarattığı nesnenin bir alt kümesi olduğunu söyleyebilirsiniz.

  3. Son parametre, gövde talebinde tam formunda alınan şirket nesnesidir.

FINALY

Nihai sonuç olarak, bu API'ye yeni bir şirket oluşturmak için Gönderi yapıldığında, size yeni oluşturulan kaynağı döndürecek 'api / company / {id}' gibi bir rota döndüreceksiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.