Estoy tratando de publicar múltiples parámetros en un controlador WebAPI. Un parámetro es de la URL y el otro del cuerpo. Aquí está la url:
/offers/40D5E19D-0CD5-4FBD-92F8-43FDBB475333/prices/
Aquí está mi código de controlador:
public HttpResponseMessage Put(Guid offerId, OfferPriceParameters offerPriceParameters)
{
//What!?
var ser = new DataContractJsonSerializer(typeof(OfferPriceParameters));
HttpContext.Current.Request.InputStream.Position = 0;
var what = ser.ReadObject(HttpContext.Current.Request.InputStream);
return new HttpResponseMessage(HttpStatusCode.Created);
}
El contenido del cuerpo está en JSON:
{
"Associations":
{
"list": [
{
"FromEntityId":"276774bb-9bd9-4bbd-a7e7-6ed3d69f196f",
"ToEntityId":"ed0d2616-f707-446b-9e40-b77b94fb7d2b",
"Types":
{
"list":[
{
"BillingCommitment":5,
"BillingCycle":5,
"Prices":
{
"list":[
{
"CurrencyId":"274d24c9-7d0b-40ea-a936-e800d74ead53",
"RecurringFee":4,
"SetupFee":5
}]
}
}]
}
}]
}
}
¿Alguna idea de por qué el enlace predeterminado no puede vincularse al offerPriceParameters
argumento de mi controlador? Siempre se establece en nulo. Pero puedo recuperar los datos del cuerpo usando DataContractJsonSerializer
.
También trato de usar el FromBody
atributo del argumento pero tampoco funciona.
.net
asp.net-web-api
Normand Bedard
fuente
fuente
Nativamente WebAPI no admite el enlace de múltiples parámetros POST. Como señala Colin, hay una serie de limitaciones que se describen en la publicación de mi blog que él menciona.
Hay una solución al crear un enlazador de parámetros personalizado. El código para hacer esto es feo y complicado, pero publiqué el código junto con una explicación detallada en mi blog, listo para ser conectado a un proyecto aquí:
Pasar múltiples valores POST simples a la API web ASP.NET
fuente
Si se utiliza el enrutamiento de atributos, puede utilizar los atributos [FromUri] y [FromBody].
Ejemplo:
fuente
[FromRoute]
lugar de[FromUri]
Pasamos el objeto Json por el método HttpPost y lo analizamos en un objeto dinámico. funciona bien. Este es un código de muestra:
webapi:
El tipo de objeto complejo podría ser objeto, matriz y diccionario.
fuente
Se puede usar una clase de parámetro simple para pasar múltiples parámetros en una publicación:
fuente
Puede permitir múltiples parámetros POST utilizando la clase MultiPostParameterBinding de https://github.com/keith5000/MultiPostParameterBinding
Para usarlo:
1) Descargue el código en la carpeta Fuente y agréguelo a su proyecto de API web o cualquier otro proyecto en la solución.
2) Use el atributo [MultiPostParameters] en los métodos de acción que necesitan soportar múltiples parámetros POST.
3) Agregue esta línea en Global.asax.cs al método Application_Start en cualquier lugar antes de la llamada a GlobalConfiguration.Configure (WebApiConfig.Register) :
4) Haga que sus clientes pasen los parámetros como propiedades de un objeto. Un objeto JSON de ejemplo para el
DoSomething(param1, param2, param3)
método es:Ejemplo JQuery:
Visite el enlace para más detalles.
Descargo de responsabilidad: estoy directamente asociado con el recurso vinculado.
fuente
Buena pregunta y comentarios: aprendí mucho de las respuestas aquí :)
Como ejemplo adicional, tenga en cuenta que también puede mezclar cuerpo y rutas, por ejemplo
Llamando así:
fuente
¿Cómo se ve su routeTemplate para este caso?
Publicaste esta url:
Para que esto funcione, esperaría una ruta como esta en su
WebApiConfig
:Otros supuestos son: - se llama a su controlador
OffersController
. - el objeto JSON que está pasando en el cuerpo de la solicitud es de tipoOfferPriceParameters
(no de ningún tipo derivado) - no tiene ningún otro método en el controlador que pueda interferir con este (si lo hace, intente comentarlos y vea qué sucede)Y como Filip mencionó, ayudaría a sus preguntas si comenzara a aceptar algunas respuestas, ya que la "tasa de aceptación del 0%" podría hacer que las personas piensen que están perdiendo el tiempo.
fuente
Si no desea seguir el modelo, puede usar DTO para hacer esto por usted. Por ejemplo, cree una acción POST en DataLayer que acepte un tipo complejo y envíe datos desde BusinessLayer. Puede hacerlo en caso de UI-> llamada a la API.
Aquí hay una muestra de DTO. Asignar un maestro a un alumno y asignar múltiples trabajos / asignaturas al alumno.
Entonces la acción en DataLayer se puede crear como:
Para llamarlo desde BusinessLayer:
Ahora, esto seguirá funcionando si quiero enviar datos de varios estudiantes a la vez. Modifica el me
MyAction
gusta a continuación. No es necesario escribir [FromBody], WebAPI2 toma el tipo complejo [FromBody] por defecto.y luego mientras lo llama, pase un
List<StudentCurriculumDTO>
dato.fuente
Parámetros de solicitud como
Código API web sea como
fuente
Puede obtener los datos de formulario como cadena:
https://docs.microsoft.com/en-us/aspnet/web-api/overview/advanced/sending-html-form-data-part-2
fuente