Comment passer plusieurs paramètres aux méthodes du contrôleur API Web

Dans un article précédent, nous avons exploré la liaison de paramètres dans l'API Web. Dans cet article, nous allons apprendre à transmettre plusieurs paramètres aux méthodes de contrôleur API Web.

L'API Web fournit les méthodes d'action nécessaires pour les opérations HTTP GET, POST, PUT et DELETE. Vous passeriez généralement un seul objet en tant que paramètre aux méthodes d'action PUT et POST. Notez que l'API Web ne prend pas en charge le passage de plusieurs paramètres POST aux méthodes de contrôleur d'API Web par défaut. Mais que se passerait-il si vous deviez faire une requête POST avec plusieurs objets passés en paramètres à une méthode de contrôleur API Web?

Comprendre le problème

L'API Web ne vous permet pas de transmettre plusieurs objets complexes dans la signature de méthode d'une méthode de contrôleur d'API Web - vous ne pouvez publier qu'une seule valeur dans une méthode d'action d'API Web. Cette valeur à son tour peut même être un objet complexe. Il est possible de transmettre plusieurs valeurs lors d'une opération POST ou PUT en mappant un paramètre sur le contenu réel et les autres via des chaînes de requête.

La classe de contrôleur suivante contient une méthode POST nommée Save qui accepte plusieurs paramètres.

public class AuthorsController: ApiController

    {

        [HttpPost]

        public HttpResponseMessage Save (int Id, string FirstName, string LastName, string Address)

        {

            // Code usuel

            return Request.CreateResponse (HttpStatusCode.OK, "Success ...");

        }

   }

Supposons maintenant que vous tentiez d'appeler la méthode du contrôleur d'API Web à partir de JQuery comme indiqué ci-dessous.

$ .ajax ({

 url: 'api / auteurs',

 tapez: 'POST',

 data: {Id: 1, FirstName: 'Joydip', LastName: 'Kanjilal', Address: 'Hyderabad'},

 dataType: 'json',

 succès: fonction (données) {

alerte (données);

}});

Malheureusement, cet appel échouera car cette demande ne peut pas être traitée par l'API Web. De même, si vous disposez d'une méthode de contrôleur d'API Web qui accepte plusieurs objets complexes, vous ne pourrez pas appeler cette méthode directement à partir d'un client de manière simple.

[HttpPost]

public HttpResponseMessage PostAuthor (Auteur auteur, chaîne authenticationToken)

{

  // Code usuel

  return Request.CreateResponse (HttpStatusCode.OK, "Success ...");

}

Vous pouvez transmettre des paramètres aux méthodes du contrôleur API Web à l'aide des attributs [FromBody] ou [FromUri]. Notez que l'attribut [FromBody] ne peut être utilisé qu'une seule fois dans la liste des paramètres d'une méthode. Pour réitérer, vous êtes autorisé à ne transmettre qu'une seule valeur (type simple ou complexe) en tant que paramètre à une méthode de contrôleur API Web lorsque vous utilisez l'attribut [FromBody]. Vous pouvez passer n'importe quel nombre de paramètres en utilisant l'attribut [FromUri] mais ce n'est pas la solution idéale dans notre cas.

Et maintenant, la solution

Maintenant que nous avons compris quel est le problème lors du passage de paramètres à une méthode de contrôleur API Web, explorons les solutions possibles. Une façon d'y parvenir est de passer l'objet complexe en tant qu'attribut [FromBody] et le paramètre de chaîne via l'URI comme indiqué dans l'extrait de code ci-dessous.

$ .ajax ({

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

 tapez: 'POST',

  données: JSON.stringify (auteur),

 dataType: 'json',

 succès: fonction (données) {

   alerte (données);

}});

Vous devrez modifier votre méthode de contrôleur API Web en conséquence pour analyser la chaîne de requête comme indiqué ci-dessous.

[HttpPost]

public HttpResponseMessage PostAuthor (Auteur auteur)

{

  var data = Request.RequestUri.ParseQueryString ();

  critère de chaîne = queryItems ["authenticationToken"];

  // Code habituel pour stocker les données dans la base de données

  return Request.CreateResponse (HttpStatusCode.OK, "Success ...");

}

Eh bien, mais que se passe-t-il si vous avez plusieurs objets complexes à transmettre en tant que paramètres à la méthode du contrôleur API Web? Vous pouvez créer un seul objet qui encapsule les multiples paramètres. Reportez-vous à la classe AuthorRequest ci-dessous.

Public class AuthorRequest

   {

      public Auteur Auteur {get; ensemble; }

      chaîne publique Token {get; ensemble; }

   }

Fondamentalement, vous pouvez encapsuler plusieurs paramètres dans une seule classe et utiliser cette classe comme paramètre de votre méthode de contrôleur API Web.

Voici la méthode de contrôleur d'API Web mise à jour.

[HttpPost]

public HttpResponseMessage PostAuthor (demande AuthorRequest)

  {

       var auteur = request.Author;

       var token = request.Token;

       // Code habituel pour stocker les données dans la base de données

       return Request.CreateResponse (HttpStatusCode.OK, "Success ...");

  }

Vous pouvez également utiliser JObject pour analyser plusieurs valeurs de paramètres à partir d'un objet.

[HttpPost]

public HttpResponseMessage PostAuthor (JObject jsonData)

{

    json dynamique = jsonData;

    JObject jauthor = json.Author;

    jeton de chaîne = json.Token;

    var auteur = jauthor.ToObject ();

    // Code habituel pour stocker les données dans la base de données

    return Request.CreateResponse (HttpStatusCode.OK, "Success ...");

}

Une autre façon de résoudre ce problème consiste à utiliser FormDataCollection. Incidemment, FormDataCollection est une collection de paires clé / valeur un peu comme FormCollection dans MVC.

[HttpPost]

        public HttpResponseMessage PostAuthor (formulaire FormDataCollection)

        {

            var auteur = form.Get ("Auteur");

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

            // Code habituel pour stocker les données dans la base de données

            return Request.CreateResponse (HttpStatusCode.OK, "Success ...");

        }

Grâce à l'extensibilité de l'infrastructure d'API Web, vous pouvez également créer votre propre classeur de paramètres personnalisé en étendant la classe HttpParameterBinding pour prendre en charge la liaison de plusieurs paramètres.

Comment faire plus dans ASP.NET et ASP.NET Core:

  • Comment utiliser la mise en cache en mémoire dans ASP.NET Core
  • Comment gérer les erreurs dans l'API Web ASP.NET
  • Comment passer plusieurs paramètres aux méthodes du contrôleur API Web
  • Comment consigner les métadonnées de demande et de réponse dans l'API Web ASP.NET
  • Comment travailler avec HttpModules dans ASP.NET
  • Contrôle de version avancé dans l'API Web ASP.NET Core
  • Comment utiliser l'injection de dépendances dans ASP.NET Core
  • Comment travailler avec des sessions dans ASP.NET
  • Comment travailler avec HTTPHandlers dans ASP.NET
  • Comment utiliser IHostedService dans ASP.NET Core
  • Comment consommer un service SOAP WCF dans ASP.NET Core
  • Comment améliorer les performances des applications ASP.NET Core
  • Comment consommer une API Web ASP.NET Core à l'aide de RestSharp
  • Comment travailler avec la journalisation dans ASP.NET Core
  • Comment utiliser MediatR dans ASP.NET Core
  • Comment travailler avec l'état de session dans ASP.NET Core
  • Comment utiliser Nancy dans ASP.NET Core
  • Comprendre la liaison de paramètres dans l'API Web ASP.NET
  • Comment télécharger des fichiers dans ASP.NET Core MVC
  • Comment implémenter la gestion globale des exceptions dans l'API Web ASP.NET Core
  • Comment implémenter les vérifications de l'état dans ASP.NET Core
  • Meilleures pratiques de mise en cache dans ASP.NET
  • Comment utiliser la messagerie Apache Kafka dans .NET
  • Comment activer CORS sur votre API Web
  • Quand utiliser WebClient vs HttpClient vs HttpWebRequest
  • Comment travailler avec Redis Cache dans .NET
  • Quand utiliser Task.WaitAll par rapport à Task.WhenAll dans .NET