2017-12-22 2 views
3

Ich möchte Verbraucher meiner API über den Speicherort des neu erstellten Objekts informieren. Ich weiß, dass es Created()CreatedAtRoute() und CreatedAtAction() gibt, aber ich bin unsicher, wie man es benutzt. HierWie zu verwenden Created (oder CreatedAtAction/CreatedAtRoute) in einem ASP Net-Core-API

ist, was ich versucht habe:

Ich habe ein Get Ressource, die Ich mag würde zeigen. Es dauert eine ID als Eingabe:

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

Wenn ein Produkt über meine POST Route erstellt wird, ich möchte über den Location-Header auf diese Ressource verweisen:

Versuch 1

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

Dies gibt einen Location-Header von: http://localhost:5000/ $ 15003

Versuch 2

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

Dies funktioniert und gibt /api/v1.0/produkte/16004 aber es scheint, wie die aktuelle Anforderung an den neuen Standort Punkt benutzen, soll nicht sein erforderlich. Auch ich bin mir nicht sicher, ob das eine gute Praxis ist?

Danke für jede Hilfe.

Antwort

1

In Ihrer Route für die Get-Methode nehmen Sie sowohl das führende/als auch das $ out (d. H. Es sollte nur "{id}" sein). Durch die Angabe des Vorzeichens/wird die Route relativ zur Basis der Anwendung angezeigt; Wenn Sie es herausnehmen, wird stattdessen der Pfad für die Methode relativ zum Basispfad des Controllers festgelegt. Das $ wird in der Route als ein Literalzeichen behandelt, weshalb es in der Location-Kopfzeile in Versuch 1 angezeigt wurde. Sobald Sie die Änderungen vorgenommen haben, sollten Sie feststellen, dass Ihr CreatedAtRoute-Aufruf wie erwartet funktioniert.

+1

Ich würde auch hinzufügen, dass Ihre ProducesResponseType-Annotation für die CreateNewProduct-Methode einen Rückgabecode 201 und nicht 200 angeben sollte. –

+0

Danke Graham! Ich war so auf die CreatedAt-Methode konzentriert, dass ich einen dummen Fehler in meiner Get-Methode gemacht habe :) Have a great 2018 – Riscie

Verwandte Themen