Programmering

Sådan overføres flere parametre til Web API-controller-metoder

I et tidligere indlæg her undersøgte vi parameterbinding i Web API. I dette indlæg vil vi lære at overføre flere parametre til Web API-controller-metoder.

Web API giver de nødvendige handlingsmetoder til HTTP GET, POST, PUT og DELETE-operationer. Du sender typisk et enkelt objekt som parameter til PUT- og POST-handlingsmetoderne. Bemærk, at Web API ikke understøtter overførsel af flere POST-parametre til Web API-controller-metoder som standard. Men hvad nu hvis du skulle lave en POST-anmodning med flere objekter sendt som parametre til en Web API-controller-metode?

Forståelse af problemet

Web API giver dig ikke mulighed for at videregive flere komplekse objekter i metodesignaturen til en Web API-controller-metode - du kan kun sende en enkelt værdi til en Web API-handlingsmetode. Denne værdi kan igen endda være et komplekst objekt. Det er muligt at overføre flere værdier dog til en POST- eller en PUT-operation ved at kortlægge en parameter til det faktiske indhold og de resterende via forespørgselsstrenge.

Følgende controller-klasse indeholder en POST-metode ved navn Save, der accepterer flere parametre.

offentlig klasse AuthorsController: ApiController

    {

[HttpPost]

offentlig HttpResponseMessage Gem (int Id, streng Fornavn, streng Efternavn, streng Adresse)

        {

// Almindelig kode

returner Request.CreateResponse (HttpStatusCode.OK, "Succes ...");

        }

   }

Antag nu, at du forsøger at ringe til Web API-controller-metoden fra JQuery som vist nedenfor.

$ .ajax ({

url: 'api / forfattere',

type: 'POST',

data: {Id: 1, Fornavn: 'Joydip', Efternavn: 'Kanjilal', Adresse: 'Hyderabad'},

dataType: 'json',

succes: funktion (data) {

alarm (data);

}});

Desværre mislykkes dette opkald, da denne anmodning ikke kan behandles af Web API. Tilsvarende, hvis du har en Web API-controller-metode, der accepterer flere komplekse objekter, ville du ikke være i stand til at påkalde denne metode direkte fra en klient på en ligetil måde.

[HttpPost]

public HttpResponseMessage PostAuthor (Forfatterforfatter, streng authenticationToken)

{

// Almindelig kode

returner Request.CreateResponse (HttpStatusCode.OK, "Succes ...");

}

Du kan videregive parametre til Web API-controller-metoder ved hjælp af enten [FromBody] eller [FromUri] -attributterne. Bemærk, at attributten [FromBody] kun kan bruges én gang i parameterlisten for en metode. For at gentage er det tilladt, at du kun overfører en værdi (enkel eller kompleks type) som parameter til en Web API-controller-metode, når du bruger attributten [FromBody]. Du kan videregive et vilkårligt antal parametre ved hjælp af [FromUri] -attributten, men det er ikke den ideelle løsning i vores tilfælde.

Og nu, løsningen

Nu hvor vi har forstået, hvad problemet er, når vi sender parametre til en Web API-controller-metode, lad os undersøge de mulige løsninger. En måde at opnå dette på er ved at sende det komplekse objekt som en [FromBody] -attribut og strengparameteren via Uri som vist i nedenstående kodestykke.

$ .ajax ({

url: 'api / forfattere? authenticationToken = abcxyz',

type: 'POST',

data: JSON.stringify (forfatter),

dataType: 'json',

succes: funktion (data) {

alarm (data)

}});

Du bliver nødt til at ændre din Web API-controller-metode i overensstemmelse hermed for at analysere forespørgselsstrengen som vist nedenfor.

[HttpPost]

public HttpResponseMessage PostAuthor (Forfatterforfatter)

{

var data = Request.RequestUri.ParseQueryString ();

strengkriterier = queryItems ["authenticationToken"];

// Almindelig kode til lagring af data i databasen

returner Request.CreateResponse (HttpStatusCode.OK, "Succes ...");

}

Nå, men hvad hvis du har flere komplekse objekter, der skal sendes som parametre til Web API-controller-metoden? Du kan oprette et enkelt objekt, der omslutter de flere parametre. Se klassen AuthorRequest angivet nedenfor.

offentlig klasse AuthorRequest

   {

offentlig forfatter Forfatter {get; sæt; }

offentlig streng Token {get; sæt; }

   }

Dybest set kan du pakke flere parametre i en enkelt klasse og bruge denne klasse som en parameter til din Web API-controller-metode.

Her er den opdaterede Web API-controller-metode.

[HttpPost]

public HttpResponseMessage PostAuthor (AuthorRequest anmodning)

  {

var author = anmodning. forfatter;

var token = anmodning.Token;

// Almindelig kode til lagring af data i databasen

returner Request.CreateResponse (HttpStatusCode.OK, "Succes ...");

  }

Du kan også bruge JObject til at analysere flere parameterværdier fra et objekt.

[HttpPost]

offentlig HttpResponseMessage PostAuthor (JObject jsonData)

{

dynamisk json = jsonData;

JObject jauthor = json.Author;

streng token = json.Token;

var forfatter = jauthor.ToObject ();

// Almindelig kode til lagring af data i databasen

returner Request.CreateResponse (HttpStatusCode.OK, "Succes ...");

}

En anden måde at løse dette på er ved hjælp af FormDataCollection. I øvrigt er FormDataCollection en nøgle / værdipar-samling, ligesom FormCollection i MVC.

[HttpPost]

offentlig HttpResponseMessage PostAuthor (FormDataCollection form)

        {

var forfatter = form.Get ("Forfatter");

var token = form.Get ("Token");

// Almindelig kode til lagring af data i databasen

returner Request.CreateResponse (HttpStatusCode.OK, "Succes ...");

        }

Takket være Web API-rammes udvidelse kan du også oprette din egen brugerdefinerede parameterbinder ved at udvide klassen HttpParameterBinding for at yde support til binding af flere parametre.

Sådan gør du mere i ASP.NET og ASP.NET Core:

  • Sådan bruges cache i hukommelsen i ASP.NET Core
  • Sådan håndteres fejl i ASP.NET Web API
  • Sådan overføres flere parametre til Web API-controller-metoder
  • Sådan logges anmodnings- og svarmetadata i ASP.NET Web API
  • Sådan arbejder du med HttpModules i ASP.NET
  • Avanceret versionering i ASP.NET Core Web API
  • Sådan bruges afhængighedsinjektion i ASP.NET Core
  • Sådan arbejder du med sessioner i ASP.NET
  • Sådan arbejder du med HTTPHandlers i ASP.NET
  • Sådan bruges IHostedService i ASP.NET Core
  • Sådan forbruges en WCF SOAP-tjeneste i ASP.NET Core
  • Sådan forbedres ydeevnen for ASP.NET Core-applikationer
  • Sådan forbruges en ASP.NET Core Web API ved hjælp af RestSharp
  • Sådan arbejder du med logning i ASP.NET Core
  • Sådan bruges MediatR i ASP.NET Core
  • Sådan arbejder du med sessionstilstand i ASP.NET Core
  • Sådan bruges Nancy i ASP.NET Core
  • Forstå parameterbinding i ASP.NET Web API
  • Sådan uploades filer i ASP.NET Core MVC
  • Sådan implementeres global undtagelseshåndtering i ASP.NET Core Web API
  • Sådan implementeres sundhedstjek i ASP.NET Core
  • Bedste fremgangsmåder inden caching i ASP.NET
  • Sådan bruges Apache Kafka-meddelelser i .NET
  • Sådan aktiveres CORS på din web-API
  • Hvornår skal man bruge WebClient vs. HttpClient vs. HttpWebRequest
  • Sådan arbejder du med Redis Cache i .NET
  • Hvornår skal man bruge Task.WaitAll vs. Task.WhenAll i .NET