Come passare più parametri ai metodi del controller dell'API Web

In un post precedente qui abbiamo esplorato l'associazione di parametri nell'API Web. In questo post impareremo come passare più parametri ai metodi del controller dell'API Web.

L'API Web fornisce i metodi di azione necessari per le operazioni HTTP GET, POST, PUT e DELETE. In genere si passa un singolo oggetto come parametro ai metodi di azione PUT e POST. Notare che l'API Web non supporta il passaggio di più parametri POST ai metodi del controller dell'API Web per impostazione predefinita. Ma cosa succede se si dovesse effettuare una richiesta POST con più oggetti passati come parametri a un metodo del controller API Web?

Capire il problema

L'API Web non consente di passare più oggetti complessi nella firma del metodo di un metodo del controller dell'API Web: è possibile inviare solo un singolo valore a un metodo di azione dell'API Web. Questo valore a sua volta può anche essere un oggetto complesso. È possibile trasferire più valori su un'operazione POST o PUT mappando un parametro al contenuto effettivo e ai restanti tramite stringhe di query.

La seguente classe controller contiene un metodo POST denominato Save che accetta più parametri.

classe pubblica AuthorsController: ApiController

    {

        [HttpPost]

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

        {

            // Codice usuale

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

        }

   }

Supponiamo ora di tentare di chiamare il metodo del controller dell'API Web da JQuery come mostrato di seguito.

$ .ajax ({

 url: "api / autori",

 tipo: "POST",

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

 dataType: 'json',

 successo: funzione (dati) {

allerta (dati);

}});

Sfortunatamente, questa chiamata avrà esito negativo poiché questa richiesta non può essere elaborata dall'API Web. Allo stesso modo, se si dispone di un metodo del controller API Web che accetta più oggetti complessi, non sarà possibile richiamare questo metodo direttamente da un client in modo diretto.

[HttpPost]

public HttpResponseMessage PostAuthor (autore dell'autore, string authenticationToken)

{

  // Codice usuale

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

}

È possibile passare parametri ai metodi del controller API Web utilizzando gli attributi [FromBody] o [FromUri]. Notare che l'attributo [FromBody] può essere utilizzato solo una volta nell'elenco dei parametri di un metodo. Per ribadire, è consentito passare un solo valore (tipo semplice o complesso) come parametro a un metodo del controller API Web quando si utilizza l'attributo [FromBody]. È possibile passare qualsiasi numero di parametri utilizzando l'attributo [FromUri] ma nel nostro caso non è la soluzione ideale.

E ora, la soluzione

Ora che abbiamo capito qual è il problema quando si passano i parametri a un metodo di controller di API Web, esploriamo le possibili soluzioni. Un modo per ottenere ciò è passare l'oggetto complesso come attributo [FromBody] e il parametro stringa tramite Uri come mostrato nel frammento di codice seguente.

$ .ajax ({

 url: "api / autori? authenticationToken = abcxyz",

 tipo: "POST",

  dati: JSON.stringify (autore),

 dataType: 'json',

 successo: funzione (dati) {

   allerta (dati);

}});

È necessario modificare di conseguenza il metodo del controller dell'API Web per analizzare la stringa di query come mostrato di seguito.

[HttpPost]

public HttpResponseMessage PostAuthor (autore)

{

  var data = Request.RequestUri.ParseQueryString ();

  criteri stringa = queryItems ["authenticationToken"];

  // Codice usuale per memorizzare i dati nel database

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

}

Bene, ma cosa succede se hai più oggetti complessi da passare come parametri al metodo del controller dell'API Web? È possibile creare un singolo oggetto che racchiuda più parametri. Fare riferimento alla classe AuthorRequest fornita di seguito.

classe pubblica AuthorRequest

   {

      pubblico Autore Autore {get; impostato; }

      stringa pubblica Token {get; impostato; }

   }

Fondamentalmente, puoi racchiudere più parametri in una singola classe e utilizzare questa classe come parametro per il metodo del controller dell'API Web.

Ecco il metodo del controller dell'API Web aggiornato.

[HttpPost]

public HttpResponseMessage PostAuthor (richiesta AuthorRequest)

  {

       var author = request.Author;

       var token = request.Token;

       // Codice usuale per memorizzare i dati nel database

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

  }

È inoltre possibile utilizzare JObject per analizzare più valori di parametri da un oggetto.

[HttpPost]

public HttpResponseMessage PostAuthor (JObject jsonData)

{

    json dinamico = jsonData;

    JObject jauthor = json.Author;

    token stringa = json.Token;

    var autore = jauthor.ToObject ();

    // Codice usuale per memorizzare i dati nel database

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

}

Un altro modo per risolvere questo problema è usare FormDataCollection. Per inciso, FormDataCollection è una raccolta di coppie chiave / valore molto simile a FormCollection in MVC.

[HttpPost]

        public HttpResponseMessage PostAuthor (modulo FormDataCollection)

        {

            var author = form.Get ("Autore");

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

            // Codice usuale per memorizzare i dati nel database

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

        }

Grazie all'estensibilità del framework dell'API Web, puoi anche creare il tuo raccoglitore di parametri personalizzato estendendo la classe HttpParameterBinding per fornire supporto per l'associazione di più parametri.

Come fare di più in ASP.NET e ASP.NET Core:

  • Come usare la memorizzazione nella cache in memoria in ASP.NET Core
  • Come gestire gli errori nell'API Web ASP.NET
  • Come passare più parametri ai metodi del controller dell'API Web
  • Come registrare i metadati di richieste e risposte nell'API Web ASP.NET
  • Come lavorare con HttpModules in ASP.NET
  • Controllo delle versioni avanzato nell'API Web ASP.NET Core
  • Come usare l'inserimento delle dipendenze in ASP.NET Core
  • Come lavorare con le sessioni in ASP.NET
  • Come lavorare con HTTPHandlers in ASP.NET
  • Come utilizzare IHostedService in ASP.NET Core
  • Come utilizzare un servizio SOAP WCF in ASP.NET Core
  • Come migliorare le prestazioni delle applicazioni ASP.NET Core
  • Come utilizzare un'API Web ASP.NET Core usando RestSharp
  • Come lavorare con la registrazione in ASP.NET Core
  • Come usare MediatR in ASP.NET Core
  • Come lavorare con lo stato della sessione in ASP.NET Core
  • Come utilizzare Nancy in ASP.NET Core
  • Comprendere l'associazione di parametri nell'API Web ASP.NET
  • Come caricare file in ASP.NET Core MVC
  • Come implementare la gestione delle eccezioni globale nell'API Web ASP.NET Core
  • Come implementare i controlli di integrità in ASP.NET Core
  • Procedure consigliate per la memorizzazione nella cache in ASP.NET
  • Come utilizzare la messaggistica Apache Kafka in .NET
  • Come abilitare CORS sulla tua API Web
  • Quando utilizzare WebClient vs. HttpClient vs. HttpWebRequest
  • Come lavorare con Redis Cache in .NET
  • Quando utilizzare Task.WaitAll rispetto a Task.WhenAll in .NET