asp.net-web-api
Inhaltsaushandlung für ASP.NET-Web-API
Suche…
Grundlegende Informationen zur Inhaltsaushandlung von ASP.NET-Web-API
Die Inhaltsaushandlung kann als der Prozess der Auswahl der besten Darstellung für eine bestimmte Ressource definiert werden. Inhaltliche Aushandlung bedeutet, dass Client und Server zwischen ihnen verhandeln können, sodass der Client Daten entsprechend dem erforderlichen Format abrufen kann.
Es gibt drei Punkte, von denen das Internet abhängt,
- Die Ressource
- Ein Zeiger auf eine Ressource (URL)
- Darstellung der Ressource
Der dritte Punkt ist wichtiger als die anderen beiden, da alles auf der Grundlage der Sichtbarkeit der Ressource funktioniert. Wir können eine Ressource in zwei Formaten darstellen.
- XML-Format (Extensible Markup Language)
- JSON-Format (JavaScript-Objektnotation)
Einer der Standards des RESTful-Service besteht darin, dass der Client in der Lage sein sollte, zu entscheiden, in welchem Format er die Antwort in JSON oder XML erhalten möchte. Eine an den Server gesendete Anforderung enthält einen Accept-Header. Mit dem Accept-Header kann der Client das Format für die Antwort angeben.
Zum Beispiel,
Accept: application/xml gibt das Ergebnis im XML-Format zurück
Accept: application/json gibt das Ergebnis im JSON-Format zurück
Abhängig von dem Accept-Header-Wert in der Anforderung sendet der Server die Antwort. Dies wird als Content Negotiation bezeichnet.
Was passiert im Hintergrund, wenn wir Daten in einem bestimmten Format anfordern?
Der ASP.NET-Web-API-Controller generiert die Daten, die an den Client gesendet werden sollen, und leitet die Daten an die Web-API-Pipeline weiter, die dann nach Accept-Header des Clients sucht. Wählen Sie dann einen geeigneten Formatierer, um die Daten zu formatieren.
Da die ASP.NET-Web-API stark erweiterbar ist, können Sie auch mehrere Werte für den Accept-Header im Anforderungsheader angeben.
Accept: application/xml,application/json
In diesem Fall wählt der Server den ersten Formatierer, um die Antwortdaten zu formatieren.
Wir können auch den Qualitätsfaktor im Accept-Header angeben. In diesem Fall wählen Server ein Format mit höherem Qualitätsfaktor.
Accept: application/json;q=0.8,application/xml;q=0.5
Wenn wir keinen Accept-Header angeben, wählen Sie standardmäßig den JSON-Formatierer.
Wenn die Antwort im angeforderten Format an den Client gesendet wird, beachten Sie, dass der Content-Type Header der Antwort auf den entsprechenden Wert festgelegt ist. Wenn der Client beispielsweise application/xml angefordert hat, sendet der Server die Daten im XML-Format und legt außerdem den Content-Type=application/xml .
Die Formatierer werden vom Server für Anforderungs- und Antwortnachrichten verwendet. Wenn der Client eine Anfrage an den Server sendet, setzen wir den Content-Type-Header auf den entsprechenden Wert, damit der Server das Format der Daten erkennt, die wir senden.
Wenn der Client beispielsweise JSON-Daten sendet, wird der Content-Type-Header auf application/json . Der Server weiß, dass es sich um JSON-Daten handelt, und verwendet daher den JSON-Formatierer, um JSON-Daten in .NET-Typ zu konvertieren. Wenn eine Antwort vom Server an den Client gesendet wird, wird der entsprechende Formatierer in Abhängigkeit vom Accept-Header-Wert verwendet, um den .NET-Typ in JSON, XML usw. zu konvertieren.
Beispiel für verschiedene Arten von Antwortformaten:
Anwendung / Json:
{
"Email": "sample string 1",
"HasRegistered": true,
"LoginProvider": "sample string 3"
}
Anwendung / XML:
<UserInfoViewModel xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/WebApiDemo.Models">
<Email>sample string 1</Email>
<HasRegistered>true</HasRegistered>
<LoginProvider>sample string 3</LoginProvider>
</UserInfoViewModel>
Moderne webbasierte Anwendungen können Daten in verschiedenen Sprachen und Formaten bereitstellen. Wenn wir also unsere API für globale Benutzer auf der ganzen Welt entwickeln, ist die Inhaltsaushandlung relevant.
Inhaltsverhandlung in der Web-API
Das Konzept verstehen
Um die Inhaltsaushandlung in der Web-API zu verstehen, ist es wichtig, den Begriff Resource zu verstehen.
Im Web können alle Informationen, auf die wir zugreifen können, als HTTP resource . Es gibt eine enorme Menge an Material im Web, das unterschiedliche Inhaltstypen hat, wie HTML-Dokumente, Bilder, Video, Audio, ausführbare Dateien, Tabellenkalkulation usw. Wir können jede Ressource erhalten, indem Sie eine http-Anfrage an die Ressource uri stellen. Die http-Antwort für die Anforderung gibt die Ressource zurück und gibt auch den Inhaltstyp an, der also known as media type .
Um auf eine beliebige Ressource zuzugreifen, kann der Client eine http-Anforderung stellen, indem er die spezifischen Ressourcen uri und die http-Verben bereitstellt. Darüber hinaus kann der Client auch den Accept-Typ angeben, der dem Format des Inhalts entspricht, nach dem der Benutzer sucht. Der "Accept-Typ" kann in den HTTP-Request-Headern als “accept” Accept “accept” -Header definiert werden.
Der Server überprüft dann den Header "Accept" aus den Anforderungen und gibt die Antwort im angegebenen Format zurück, sofern verfügbar. Bitte beachten Sie, dass der Server die Antwort in der angeforderten Darstellung nur zurückgeben kann, wenn sie verfügbar ist . Wenn die angeforderte Darstellung nicht verfügbar ist, wird die Ressource in der Standarddarstellung zurückgegeben. Das ist der Grund, warum es Inhaltsverhandlung genannt wird.
Ein praktisches Beispiel
Nehmen Sie als Beispiel an, dass Sie eine Anfrage an http://example.com/customer/1 richten, um die Informationen des Kunden mit der ID zu erhalten. 1. Wenn Sie in der Anfrage nicht den Header "Accept" angeben, wird der Der Server gibt die Standarddarstellung dieser Ressource zurück.
Angenommen, der Server kann die Kundeninformationen in json and xml both . Nun muss der Client das erforderliche Format der Kundeninformationen im Header "Accept" der Anfrage angeben. Der Wert des “accept” Header kann sein “application/json” für json Darstellung oder “text/xml” für XML - Darstellung. Der Server sendet dann die Antwort gemäß dem angeforderten Format.
Wenn das angeforderte Format "text / html" ist, das von diesem Host nicht unterstützt wird (wie in diesem Beispiel), wird simply return the resource in the default format . Die http-Antwort enthält einen Header “content-type” der dem Client das Format der Ressource mitteilt.
Beachten Sie, dass die Standarddarstellung der Ressource auch dann zurückgegeben wird, wenn die angeforderte Darstellung der Ressource nicht verfügbar ist.
Deshalb wird es als Inhaltsverhandlung bezeichnet .
Der Client handelt die Darstellung der Antwort aus. Wenn diese jedoch nicht verfügbar ist, wird die Standardantwort angezeigt.
So konfigurieren Sie in der Web-API
In der Web-API kann die Inhaltsaushandlung in der WebAPIConfig Klasse als konfiguriert werden
config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new System.Net.Http.Headers.MediaTypeHeaderValue("text/html"));
Sie können die Standardaushandlung für Inhalte in der Web-API auch überschreiben, indem Sie die IContentNegotiator-Schnittstelle und ihre Negotiate-Methode implementieren und diese dann in der Web-API-Anforderungspipeline in der Datei WebAPI.config wie folgt einrichten:
GlobalConfiguration.Configuration.Services.Replace(typeof(IContentNegotiator), new CustomContentNegotiator());
Im Folgenden finden Sie eine Beispielimplementierung der Negotiate-Methode.
public class CustomContentNegotiator : DefaultContentNegotiator
{
public override ContentNegotiationResult Negotiate(Type type, HttpRequestMessage request, IEnumerable<MediaTypeFormatter> formatters)
{
var result = new ContentNegotiationResult(new JsonMediaTypeFormatter(), new MediaTypeHeaderValue("application/json"));
return result;
}