Sök…


ASP.NET Web API-innehållsförhandling Grundläggande information

Innehållsförhandling kan definieras som processen för att välja bästa representation för en given resurs. Så innehållsförhandling innebär att klienten och servern kan förhandla mellan dem så att klienten kan få data i enlighet med deras önskade format.

Det finns tre punkter på vilket internet beror,

  • Resursen
  • En pekare till resurs (URL)
  • Representation av resursen

Den tredje punkten är viktigare än andra två, eftersom allt fungerar utifrån hur vi kan se resursen. Vi kan representera en resurs i två format.

  1. XML-format (Extensible Markup Language)
  2. JSON-format (JavaScript Object Notation)

En av standarderna för RESTful-tjänsten är att klienten ska ha möjlighet att bestämma i vilket format de vill ha svaret antingen i JSON eller XML. En begäran som skickas till servern innehåller en Accept-rubrik. Med Accept-rubriken kan klienten specificera formatet för svaret.

Till exempel,

Accept: application/xml returnerar resultatet i XML-format

Accept: application/json returnerar resultatet i JSON-format

Beroende på Acceptera rubrikvärdet i begäran skickar servern svaret. Detta kallas innehållsförhandling.

Vad händer bakom scenen när vi begär data i specifikt format?

ASP.NET Web API-kontrollenhet genererar de data som vi vill skicka till klienten och överlämnar informationen till Web API-pipeline som sedan letar efter Accept-header för klienten. Välj sedan en lämplig formaterare för att formatera data.

Eftersom ASP.NET Web API är mycket utdragbart kan vi också ange flera värden för att acceptera rubriker i begäran.

Accept: application/xml,application/json

I ovanstående fall väljer servern den första formatorn för att formatera svarsdata.

Vi kan också ange kvalitetsfaktor i accepthuvudet. I detta fall väljer servern ett format som har högre kvalitetsfaktor.

Accept: application/json;q=0.8,application/xml;q=0.5

Om vi inte anger någon Acceptera rubrik väljer du JSON-formaterare som standardserver.

När svaret skickas till klienten i det begärda formatet, märker du att Content-Type rubrik i Content-Type är inställt på rätt värde. Om klienten till exempel har begärt application/xml , skickar servern data i XML-format och ställer också in Content-Type=application/xml .

Formaterna används av servern för både begäran och svarsmeddelanden. När klienten skickar en begäran till servern ställer vi in rubriken Content-Type till lämpligt värde för att låta servern känna till formatet för data som vi skickar.

Om klienten till exempel skickar JSON-data, är rubriken Content-Type inställd på application/json . Servern vet att den har att göra med JSON-data, så den använder JSON-formaterare för att konvertera JSON-data till .NET Type. På samma sätt när ett svar skickas från servern till klienten, beroende på Accept-huvudvärde, används lämplig formaterare för att konvertera .NET-typ till JSON, XML etc.

Exempel på olika typer av svarformat:

application / json:

{
  "Email": "sample string 1",
  "HasRegistered": true,
  "LoginProvider": "sample string 3"
}

application / 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>

Moderna webbaserade applikationer kan tillhandahålla data på olika språk och format. Så om vi utvecklar vårt API för att täcka globala användare över hela världen, så är innehållsförhandling relevant.

Innehållsförhandling i webb-API

Förstå konceptet

För att förstå innehållsförhandlingar i Web API är det viktigt att förstå termen Resource .

På webben kan all information som vi har åtkomst kallas HTTP resource . Det finns en enorm mängd material att se på webben som har olika innehållstyper som HTML-dokument, bilder, video, ljud, körbara filer, kalkylark etc. Vi kan få alla resurser genom att göra en http-begäran till resursen uri. Http-svaret för begäran, returnerar resursen och anger också innehållstypen, som also known as media type .

För att få åtkomst till valfri resurs kan klienten göra http-begäran genom att tillhandahålla specifika resursuri och http-verb. Men utöver detta kan klienten också specificera acceptortypen som är formatet på innehållet som användaren letar efter. "Acceptera-typen" kan definieras i rubrikerna för http-begäran som “accept” -huvud.

Servern kontrollerar sedan "accept" -huvudet från förfrågningarna och returnerar svaret i det angivna formatet, om det finns tillgängligt. Observera att servern endast kan returnera svaret i den begärda representationen om det är tillgängligt . Om den begärda representationen inte är tillgänglig returnerar den resursen i standardrepresentation. Det är anledningen till att det kallas innehållsförhandling.


Ett praktiskt exempel

Som ett exempel antar du att du gör en begäran till http://example.com/customer/1 för att få information om kunden med id 1. Om du inte anger "accept" -huvudet i begäran, servern returnerar standardrepresentationen av denna resurs.

Antag att servern kan returnera kundinformationen både i json and xml both . Nu ligger det på klienten att ange önskat format för kundinformationen i "acceptera" -huvudet i begäran. Värdet på “accept” -huvudet kan vara “application/json” för jsonrepresentation, eller “text/xml” för xml-representation. Servern returnerar sedan svaret enligt det begärda formatet.

Om det begärda formatet är "text / html" som inte stöds av denna värd (som i det här exemplet) kommer det simply return the resource in the default format . Http-svaret innehåller en rubrik “content-type” som berättar klienten om resursformatet.

Observera att även om den begärda representationen av resursen inte är tillgänglig returneras resursens standardrepresentation fortfarande.

Det är därför det kallas innehållsförhandling .

Klienten förhandlar fram representationen av svaret, men om det inte är tillgängligt får han standardinställningen.


Hur man konfigurerar i Web API

I Web API kan innehållsförhandling konfigureras i klassen WebAPIConfig som

config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new System.Net.Http.Headers.MediaTypeHeaderValue("text/html"));

Du kan också åsidosätta standardförhandlingsinnehållet i Web API genom att implementera IContentNegotiator-gränssnittet och dess förhandlingsmetod, och sedan konfigurera detta i Web API-begäran, i WebAPI.config-filen som nedan:

GlobalConfiguration.Configuration.Services.Replace(typeof(IContentNegotiator), new CustomContentNegotiator());

Följande är ett exempel på implantering av förhandlingsmetoden.

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


Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow