Cómo pasar varios parámetros a los métodos del controlador de API web

En una publicación anterior aquí, exploramos el enlace de parámetros en la API web. En esta publicación, aprenderemos cómo pasar múltiples parámetros a los métodos del controlador de API web.

Web API proporciona los métodos de acción necesarios para las operaciones HTTP GET, POST, PUT y DELETE. Normalmente pasaría un solo objeto como parámetro a los métodos de acción PUT y POST. Tenga en cuenta que la API web no admite el paso de varios parámetros POST a los métodos del controlador de la API web de forma predeterminada. Pero, ¿qué pasaría si realizara una solicitud POST con varios objetos pasados ​​como parámetros a un método de controlador de API web?

Entendiendo el problema

La API web no le permite pasar varios objetos complejos en la firma de método de un método de controlador de API web; puede publicar solo un valor en un método de acción de API web. Este valor a su vez puede ser incluso un objeto complejo. Es posible pasar varios valores a través de una operación POST o PUT asignando un parámetro al contenido real y los restantes a través de cadenas de consulta.

La siguiente clase de controlador contiene un método POST denominado Guardar que acepta varios parámetros.

AuthorsController de clase pública: ApiController

    {

        [HttpPost]

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

        {

            // Código habitual

            return Request.CreateResponse (HttpStatusCode.OK, "Éxito ...");

        }

   }

Ahora suponga que intenta llamar al método del controlador Web API desde JQuery como se muestra a continuación.

$ .ajax ({

 url: 'api / autores',

 tipo: 'POST',

 datos: {Id: 1, Nombre: 'Joydip', Apellido: 'Kanjilal', Dirección: 'Hyderabad'},

 dataType: 'json',

 éxito: función (datos) {

alerta (datos);

}});

Lamentablemente, esta llamada fallará ya que la API web no puede procesar esta solicitud. De manera similar, si tiene un método de controlador de API web que acepta múltiples objetos complejos, no podrá invocar este método directamente desde un cliente de una manera sencilla.

[HttpPost]

public HttpResponseMessage PostAuthor (Autor autor, string authenticationToken)

{

  // Código habitual

  return Request.CreateResponse (HttpStatusCode.OK, "Éxito ...");

}

Puede pasar parámetros a los métodos del controlador Web API utilizando los atributos [FromBody] o [FromUri]. Tenga en cuenta que el atributo [FromBody] solo se puede utilizar una vez en la lista de parámetros de un método. Para reiterar, se le permite pasar solo un valor (tipo simple o complejo) como parámetro a un método de controlador Web API cuando se usa el atributo [FromBody]. Puede pasar cualquier número de parámetros usando el atributo [FromUri] pero esa no es la solución ideal en nuestro caso.

Y ahora la solucion

Ahora que hemos entendido cuál es el problema al pasar parámetros a un método de controlador de API web, exploremos las posibles soluciones. Una forma de lograr esto es pasando el objeto complejo como un atributo [FromBody] y el parámetro de cadena a través del Uri como se muestra en el fragmento de código a continuación.

$ .ajax ({

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

 tipo: 'POST',

  datos: JSON.stringify (autor),

 dataType: 'json',

 éxito: función (datos) {

   alerta (datos);

}});

Debería modificar su método de controlador de API web en consecuencia para analizar la cadena de consulta como se muestra a continuación.

[HttpPost]

public HttpResponseMessage PostAuthor (Autor autor)

{

  var data = Request.RequestUri.ParseQueryString ();

  cadena de criterios = queryItems ["authenticationToken"];

  // Código habitual para almacenar datos en la base de datos

  return Request.CreateResponse (HttpStatusCode.OK, "Éxito ...");

}

Bueno, pero ¿qué sucede si tiene varios objetos complejos para pasar como parámetros al método del controlador de API web? Puede crear un solo objeto que envuelva los múltiples parámetros. Consulte la clase AuthorRequest que se proporciona a continuación.

AuthorRequest de clase pública

   {

      Autor público Autor {get; conjunto; }

      Token de cadena pública {get; conjunto; }

   }

Básicamente, puede envolver varios parámetros en una sola clase y usar esta clase como parámetro para su método de controlador de API web.

Aquí está el método de controlador de API web actualizado.

[HttpPost]

public HttpResponseMessage PostAuthor (solicitud AuthorRequest)

  {

       var author = request.Author;

       var token = request.Token;

       // Código habitual para almacenar datos en la base de datos

       return Request.CreateResponse (HttpStatusCode.OK, "Éxito ...");

  }

También puede usar JObject para analizar múltiples valores de parámetros desde fuera de un objeto.

[HttpPost]

public HttpResponseMessage PostAuthor (JObject jsonData)

{

    json dinámico = jsonData;

    JObject jauthor = json.Author;

    token de cadena = json.Token;

    var autor = jauthor.ToObject ();

    // Código habitual para almacenar datos en la base de datos

    return Request.CreateResponse (HttpStatusCode.OK, "Éxito ...");

}

Otra forma de resolver esto es usando FormDataCollection. Por cierto, FormDataCollection es una colección de pares clave / valor muy similar a FormCollection en MVC.

[HttpPost]

        public HttpResponseMessage PostAuthor (formulario FormDataCollection)

        {

            var autor = formulario.Get ("Autor");

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

            // Código habitual para almacenar datos en la base de datos

            return Request.CreateResponse (HttpStatusCode.OK, "Éxito ...");

        }

Gracias a la extensibilidad del marco de la API web, también puede crear su propio enlazador de parámetros personalizados ampliando la clase HttpParameterBinding para brindar soporte para el enlace de múltiples parámetros.

Cómo hacer más en ASP.NET y ASP.NET Core:

  • Cómo usar el almacenamiento en caché en memoria en ASP.NET Core
  • Cómo manejar errores en ASP.NET Web API
  • Cómo pasar varios parámetros a los métodos del controlador de API web
  • Cómo registrar metadatos de solicitud y respuesta en ASP.NET Web API
  • Cómo trabajar con HttpModules en ASP.NET
  • Control de versiones avanzado en ASP.NET Core Web API
  • Cómo usar la inyección de dependencia en ASP.NET Core
  • Cómo trabajar con sesiones en ASP.NET
  • Cómo trabajar con HTTPHandlers en ASP.NET
  • Cómo usar IHostedService en ASP.NET Core
  • Cómo consumir un servicio WCF SOAP en ASP.NET Core
  • Cómo mejorar el rendimiento de las aplicaciones ASP.NET Core
  • Cómo consumir una API web ASP.NET Core con RestSharp
  • Cómo trabajar con el registro en ASP.NET Core
  • Cómo usar MediatR en ASP.NET Core
  • Cómo trabajar con el estado de la sesión en ASP.NET Core
  • Cómo usar Nancy en ASP.NET Core
  • Comprender el enlace de parámetros en ASP.NET Web API
  • Cómo cargar archivos en ASP.NET Core MVC
  • Cómo implementar el manejo de excepciones globales en ASP.NET Core Web API
  • Cómo implementar comprobaciones de estado en ASP.NET Core
  • Mejores prácticas de almacenamiento en caché en ASP.NET
  • Cómo utilizar la mensajería de Apache Kafka en .NET
  • Cómo habilitar CORS en su API web
  • Cuándo usar WebClient frente a HttpClient frente a HttpWebRequest
  • Cómo trabajar con Redis Cache en .NET
  • Cuándo usar Task.WaitAll frente a Task.WhenAll en .NET