Kann mir jemand CreatedAtRoute () erklären?

136

In der Vorlage für Web API 2 lautet eine Post-Methode immer wie folgt:

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

Ich verstehe diese CreatedAtRoute()Methode nicht. Kann CreatedAtRoute()mir jemand die Methode erklären ?

kriegerisch
quelle
24
@ JohnSaunders natürlich habe ich diese Google-Ergebnisse gefunden. Mein Problem ist, dass diese Dokumente mir nicht helfen, diese Methode zu verstehen. Nachdem ich sie gelesen habe, verstehe ich sie immer noch nicht. Deshalb frage ich hier.
Martial
11
Ich beantworte meine Frage dann nicht.
Martial
12
Wenn ich googeln und eine Antwort finden kann, warum verbringe ich dann Zeit damit, Fragen zu bearbeiten und hier zu stellen?
Martial
3
Danke, dass du diese Frage gestellt hast :)
Vidar

Antworten:

157

Die CreatedAtRouteMethode soll einen URI an die neu erstellte Ressource zurückgeben, wenn Sie eine POST-Methode aufrufen, um ein neues Objekt zu speichern. Wenn Sie beispielsweise eine Bestellposition POSTEN, können Sie eine Route wie 'api / order / 11' zurückgeben (11 ist offensichtlich die ID der Bestellung).

Übrigens stimme ich zu, dass der MSDN-Artikel für das Verständnis von Nutzen ist. Die Route, die Sie tatsächlich zurückgeben, hängt natürlich von Ihrem Routing-Setup ab.

siehe schärfer
quelle
13
Was es zurückgibt, ist tatsächlich ein CreatedAtRouteNegotiatedContentResult <myObject> -Objekt! Das sehen Sie, wenn Sie einen Komponententest für Ihre Aktion durchführen. Wenn es jedoch im Kontext von http ausgeführt wird, wird das serialisierte Objekt im Hauptteil zurückgegeben. In der Antwort sollte jedoch ein Header mit dem Link zur Ressource angezeigt werden. Übrigens, wenn Sie glauben, ich hätte die Frage beantwortet, könnten Sie sie als Antwort markieren? Prost.
Siehe schärfer
3
Danke, das beantwortet meine Frage.
Martial
2
Die von Ihnen angegebene Route wird in der Antwort als Standortheader angezeigt. Dies ist ein ziemlich typisches REST-Verhalten
Jeff Martin
4
@seesharper Wenn das MyObject nicht zurückgegeben wird, ABER ... warum muss ich es an CreatedAtRoute übergeben? Was macht die Methode damit?
Elisabeth
6
Gibt es eine Möglichkeit, die aktuelle Route zu verwenden? [Route("[controller]")]Was kann ich zurückgeben , wenn ich beispielsweise mit dem Controller ein Objekt im Dateicontroller erstelle (damit die benachbarte GET-Aktion beispielsweise mit der URL aufgerufen werden kann)?
Shimmy Weitzhandler
17

Wenn Sie CreatedAtRoute verwenden, ist das erste Argument der Methodenname von Get to the resource. Der nicht so offensichtliche Trick besteht darin, dass Sie trotz des angegebenen korrekten Methodennamens den Parameter Name für das HttpGet-Attribut verwenden müssen, damit er funktioniert.

Wenn die Rückgabe in Ihrem Beitrag also wie folgt lautet:

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

Dann sollte Ihr Get-Methodenattribut so aussehen, auch wenn Ihre Methode Get heißt:

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

Aufrufe Ihrer Post-Methode geben nicht nur das neue Objekt zurück (normalerweise als JSON), sondern setzen auch den Location-Header für die Antwort auf den URI, der diese Ressource erhalten würde.

Scott Blasingame
quelle
"Dies gibt nicht nur das neue Objekt zurück (normalerweise als JSON), sondern setzt auch den Location-Header in der Antwort auf den URI, der diese Ressource erhalten würde." Mit "Dies" meinen Sie HttpGet oder HttpPost? Was meinen Sie mit "Der Location-Header wird in der Antwort auf den URI festgelegt, der diese Ressource erhalten würde".
Tran Anh Minh
"Dies" bezog sich auf die HttpPost-Methode (bearbeiten Sie die Antwort). Bei Ihrer Frage zum Standort-Header handelt es sich um einen HTTP-Header, mit dem der Client entscheiden kann, etwas zu tun, beispielsweise automatisch umzuleiten. Es ist ein Standard-HTTP-Antwortheader ( en.wikipedia.org/wiki/… ).
Scott Blasingame
Bitte können Sie Ihre Antwort so aktualisieren, dass sie auch die Bedeutung des 2. und 3. Parameters enthält.
Variable
0

In .net Core WebAPI verwenden Sie diese Methode, um einen 201-Code zurückzugeben. Dies bedeutet, dass das Objekt erstellt wurde.

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

Wie Sie oben sehen können, kann die CreatedAtRoute 3 Parameter empfangen:

routeName Ist der Name, den Sie für die Methode eingeben müssen, die der URI ist, der diese Ressource nach der Erstellung erhält.

routeValues ​​Dies ist das Objekt, das die Werte enthält, die an der benannten Route an die GET-Methode übergeben werden. Es wird verwendet, um das erstellte Objekt zurückzugeben

Inhalt Es ist das Objekt, das erstellt wurde.

Das obige Beispiel zeigt die Implementierung von zwei Methoden eines einfachen Controllers mit einer einfachen GET-Methode mit dem verbundenen Namen und der POST-Methode, die ein neues Objekt erstellt.

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

        }


    }
}

WICHTIG

  1. Beachten Sie, dass der erste Parameter bei CreatedAtRoute (routeName) bei der Definition des Namens bei der Get-Methode identisch sein muss.

  2. Das Objekt im zweiten Parameter muss über die erforderlichen Felder verfügen, die Sie zum Abrufen der Ressource in der Get-Methode verwenden. Sie können sagen, dass es sich um eine Teilmenge des selbst erstellten Objekts handelt

  3. Der letzte Parameter ist das Firmenobjekt, das in der Textanforderung in seiner vollständigen Form empfangen wurde.

ENDLICH

Als letztes Ergebnis, wenn der Beitrag zum Erstellen einer neuen Firma für diese API erstellt wurde, geben Sie eine Route wie 'api / company / {id}' zurück, die Ihnen die neu erstellte Ressource zurückgibt

Bruno Bastos
quelle