Die grundlegendste Version, die mit a antwortet, JsonResult
ist:
// GET: api/authors
[HttpGet]
public JsonResult Get()
{
return Json(_authorRepository.List());
}
Dies hilft jedoch nicht bei Ihrem Problem, da Sie Ihren eigenen Antwortcode nicht explizit behandeln können.
Um die Kontrolle über die Statusergebnisse zu erlangen, müssen Sie a zurückgeben ActionResult
, wo Sie dann den StatusCodeResult
Typ nutzen können.
beispielsweise:
// GET: api/authors/search?namelike=foo
[HttpGet("Search")]
public IActionResult Search(string namelike)
{
var result = _authorRepository.GetByNameSubstring(namelike);
if (!result.Any())
{
return NotFound(namelike);
}
return Ok(result);
}
Beachten Sie, dass diese beiden obigen Beispiele aus einem großartigen Handbuch stammen, das in der Microsoft-Dokumentation verfügbar ist: Formatieren von Antwortdaten
Extra Zeug
Das Problem, auf das ich häufig stoße, ist, dass ich eine detailliertere Kontrolle über meine WebAPI haben wollte, anstatt nur die Standardkonfiguration aus der Vorlage "Neues Projekt" in VS zu verwenden.
Lassen Sie uns sicherstellen, dass Sie einige der Grundlagen haben ...
Schritt 1: Konfigurieren Sie Ihren Service
Damit Ihre ASP.NET Core-WebAPI mit einem JSON Serialized Object unter vollständiger Kontrolle des Statuscodes antwortet, sollten Sie zunächst sicherstellen, dass Sie den AddMvc()
Dienst in Ihre ConfigureServices
normalerweise in enthaltene Methode aufgenommen haben Startup.cs
.
Es ist wichtig zu beachten, dass AddMvc()
der Eingabe- / Ausgabeformatierer für JSON automatisch einbezogen wird und auf andere Anforderungstypen reagiert wird.
Wenn für Ihr Projekt die vollständige Kontrolle erforderlich ist und Sie Ihre Dienste genau definieren möchten, z. B. wie sich Ihre WebAPI gegenüber verschiedenen Anforderungstypen verhält, einschließlich application/json
und nicht auf andere Anforderungstypen (z. B. eine Standardbrowseranforderung), können Sie diese manuell mit dem definieren folgenden Code:
public void ConfigureServices(IServiceCollection services)
{
// Build a customized MVC implementation, without using the default AddMvc(), instead use AddMvcCore().
// https://github.com/aspnet/Mvc/blob/dev/src/Microsoft.AspNetCore.Mvc/MvcServiceCollectionExtensions.cs
services
.AddMvcCore(options =>
{
options.RequireHttpsPermanent = true; // does not affect api requests
options.RespectBrowserAcceptHeader = true; // false by default
//options.OutputFormatters.RemoveType<HttpNoContentOutputFormatter>();
//remove these two below, but added so you know where to place them...
options.OutputFormatters.Add(new YourCustomOutputFormatter());
options.InputFormatters.Add(new YourCustomInputFormatter());
})
//.AddApiExplorer()
//.AddAuthorization()
.AddFormatterMappings()
//.AddCacheTagHelper()
//.AddDataAnnotations()
//.AddCors()
.AddJsonFormatters(); // JSON, or you can build your own custom one (above)
}
Sie werden feststellen, dass ich Ihnen auch eine Möglichkeit hinzugefügt habe, Ihre eigenen benutzerdefinierten Eingabe- / Ausgabeformatierer hinzuzufügen, falls Sie auf ein anderes Serialisierungsformat (Protobuf, Sparsamkeit usw.) reagieren möchten.
Der obige Codeabschnitt ist meistens ein Duplikat der AddMvc()
Methode. Wir implementieren jedoch jeden "Standard" -Dienst für sich, indem wir jeden einzelnen Dienst definieren, anstatt den vorab ausgelieferten mit der Vorlage zu verwenden. Ich habe den Repository-Link in den Codeblock eingefügt, oder Sie können AddMvc()
aus dem GitHub-Repository auschecken. .
Beachten Sie, dass es einige Anleitungen gibt, die versuchen, dieses Problem zu lösen, indem sie die Standardeinstellungen "rückgängig machen", anstatt sie erst gar nicht zu implementieren. Wenn Sie berücksichtigen, dass wir jetzt mit Open Source arbeiten, ist dies redundante Arbeit , schlechter Code und ehrlich gesagt eine alte Angewohnheit, die bald verschwinden wird.
Schritt 2: Erstellen Sie einen Controller
Ich werde Ihnen eine wirklich einfache zeigen, nur um Ihre Frage zu sortieren.
public class FooController
{
[HttpPost]
public async Task<IActionResult> Create([FromBody] Object item)
{
if (item == null) return BadRequest();
var newItem = new Object(); // create the object to return
if (newItem != null) return Ok(newItem);
else return NotFound();
}
}
Schritt 3: Überprüfen Sie Ihre Content-Type
undAccept
Sie müssen sicherstellen, dass Ihre Content-Type
und die Accept
Header in Ihrer Anfrage richtig eingestellt sind. In Ihrem Fall (JSON) möchten Sie es so einrichtenapplication/json
.
Wenn Sie möchten, dass Ihre WebAPI standardmäßig als JSON antwortet, können Sie dies auf verschiedene Arten tun, unabhängig davon, was im Anforderungsheader angegeben ist .
Weg 1
Wie in dem zuvor empfohlenen Artikel ( Formatieren von Antwortdaten ) gezeigt, können Sie ein bestimmtes Format auf Controller- / Aktionsebene erzwingen. Ich persönlich mag diesen Ansatz nicht ... aber hier ist er der Vollständigkeit halber:
Erzwingen eines bestimmten Formats Wenn Sie die Antwortformate für eine bestimmte Aktion einschränken möchten, können Sie den Filter [Produces] anwenden. Der Filter [Produces] gibt die Antwortformate für eine bestimmte Aktion (oder einen bestimmten Controller) an. Wie die meisten Filter kann dies auf die Aktion, den Controller oder den globalen Bereich angewendet werden.
[Produces("application/json")]
public class AuthorsController
Der [Produces]
Filter erzwingt, dass alle Aktionen innerhalb
AuthorsController
von JSON-formatierte Antworten zurückgeben, selbst wenn andere Formatierer für die Anwendung konfiguriert wurden und der Client einen Accept
Header bereitgestellt hat , der ein anderes verfügbares Format anfordert.
Weg 2
Meine bevorzugte Methode ist, dass die WebAPI auf alle Anforderungen mit dem angeforderten Format antwortet. Falls das angeforderte Format jedoch nicht akzeptiert wird, greifen Sie zurück einen Standard zurück (z. B. JSON).
Zuerst müssen Sie dies in Ihren Optionen registrieren (wir müssen das Standardverhalten, wie bereits erwähnt, überarbeiten).
options.RespectBrowserAcceptHeader = true; // false by default
Schließlich ordnet der Webhost durch einfaches Neuordnen der Liste der Formatierer, die im Service Builder definiert wurden, standardmäßig den Formatierer an, den Sie oben in der Liste positionieren (dh Position 0).
Weitere Informationen finden Sie in diesem Blogeintrag zu .NET Web Development and Tools
CreatedAtRoute
Methode usw.