En el siguiente código, el $http
método AngularJS llama a la URL y envía el objeto xsrf como "Solicitar carga útil" (como se describe en la pestaña de red del depurador de Chrome). El $.ajax
método jQuery realiza la misma llamada, pero envía xsrf como "Datos de formulario".
¿Cómo puedo hacer que AngularJS envíe xsrf como datos de formulario en lugar de una carga útil de solicitud?
var url = 'http://somewhere.com/';
var xsrf = {fkey: 'xsrf key'};
$http({
method: 'POST',
url: url,
data: xsrf
}).success(function () {});
$.ajax({
type: 'POST',
url: url,
data: xsrf,
dataType: 'json',
success: function() {}
});
ajax
angularjs
post
angular-http
mjibson
fuente
fuente
Respuestas:
La siguiente línea debe agregarse al objeto $ http que se pasa:
Y los datos pasados deben convertirse a una cadena codificada en URL:
Entonces tienes algo como:
De: https://groups.google.com/forum/#!msg/angular/5nAedJ1LyO0/4Vj_72EZcDsJ
ACTUALIZAR
Para usar los nuevos servicios agregados con AngularJS V1.4, vea
fuente
var xsrf = $.param({fkey: "key"});
Eso es estúpido, ¿por qué no puede hacerlo angularmente internamente?headers: {Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'}
Si no desea utilizar jQuery en la solución, puede probar esto. Solución atrapada desde aquí https://stackoverflow.com/a/1714899/1784301
fuente
for
un poco la declaración para usarlaangular.forEach
.obj[p]
no sea nulo o indefinido . De lo contrario, terminará enviando una cadena "nula" o "indefinida" como valor.transformRequest: function(obj)
Como obj no está definido, ¿suponemos pasar el xsrf? Me gustatransformRequest: function(xsrf)
La continua confusión en torno a este tema me inspiró a escribir una publicación de blog al respecto. La solución que propongo en esta publicación es mejor que su solución actual mejor calificada porque no lo restringe a parametrizar su objeto de datos para llamadas de servicio $ http; es decir, con mi solución, simplemente puede continuar pasando objetos de datos reales a $ http.post (), etc. y aún así lograr el resultado deseado.
Además, la respuesta mejor calificada se basa en la inclusión de jQuery completo en la página para la función $ .param (), mientras que mi solución es jQuery agnóstico, listo para AngularJS puro.
http://victorblog.com/2012/12/20/make-angularjs-http-service-behave-like-jquery-ajax/
Espero que esto ayude.
fuente
ASP.NET
no soportaba 'nativamente' esto. Si no desea cambiar el comportamiento de AngularJS (lo cual no hice, porque mi API devuelve JSON, ¿por qué no hacer que acepte también JSON, es más flexible que los datos de formulario?) Puede leerloRequest.InputStream
y luego manejarlo de cualquier manera lo quieres. (Elegí deserializarlodynamic
para facilitar su uso.)Tomé algunas de las otras respuestas e hice algo un poco más limpio, puse esta
.config()
llamada al final de su angular.module en su app.js:fuente
unshift()
para que las otras transformaciones permanezcan intactas. Buen trabajo.A partir de AngularJS v1.4.0, hay un servicio incorporado
$httpParamSerializer
que convierte cualquier objeto en una parte de una solicitud HTTP de acuerdo con las reglas que se enumeran en la página de documentos .Se puede usar así:
Recuerde que para una publicación de formulario correcta, se
Content-Type
debe cambiar el encabezado. Para hacer esto globalmente para todas las solicitudes POST, se puede usar este código (tomado de la media respuesta de Albireo):Para hacer esto solo para la publicación actual, la
headers
propiedad del objeto de solicitud debe modificarse:fuente
transformRequest: $httpParamSerializer, data: formDataObj
. Gracias por la solucion.Puede definir el comportamiento globalmente:
Para que no tenga que redefinirlo cada vez:
fuente
Como solución alternativa, simplemente puede hacer que el código que recibe la POST responda a los datos de la aplicación / json. Para PHP, agregué el siguiente código, lo que me permite enviarlo en formato codificado o JSON.
fuente
Estas respuestas parecen una exageración loca, a veces, simple es simplemente mejor:
fuente
Content-Type
y configurarloapplication/x-www-form-urlencoded
.Puedes probar con la siguiente solución
fuente
Cree un servicio de adaptador para publicación:
Úselo en sus controladores o lo que sea:
fuente
Hay un tutorial realmente bueno que repasa esto y otras cosas relacionadas: envío de formularios AJAX: la forma AngularJS .
Básicamente, debe establecer el encabezado de la solicitud POST para indicar que está enviando datos de formulario como una cadena codificada de URL, y configurar los datos para que se envíen con el mismo formato
Tenga en cuenta que la función auxiliar param () de jQuery se usa aquí para serializar los datos en una cadena, pero también puede hacerlo manualmente si no usa jQuery.
fuente
$.param
hacen la magia. solución perfecta para quién tiene la aplicación basada en jQuery + AngularJS.¡Por favor consulte! https://uncorkedstudios.com/blog/multipartformdata-file-upload-with-angularjs
fuente
Para usuarios de Symfony2:
Si no desea cambiar nada en su javascript para que esto funcione, puede hacer estas modificaciones en su aplicación Symfony:
Cree una clase que extienda la clase Symfony \ Component \ HttpFoundation \ Request:
Ahora use su clase en app_dev.php (o cualquier archivo de índice que use)
fuente
Simplemente configure Content-Type no es suficiente, codifique los datos del formulario antes de enviarlos.
$http.post(url, jQuery.param(data))
fuente
Actualmente estoy usando la siguiente solución que encontré en el grupo de Google AngularJS.
Tenga en cuenta que si está usando PHP, necesitará usar algo como los componentes HTTP de Symfony 2
Request::createFromGlobals()
para leer esto, ya que $ _POST no se cargará automáticamente con él.fuente
AngularJS lo está haciendo bien al hacer el siguiente tipo de contenido dentro del encabezado de solicitud http:
Si va con php como yo, o incluso con Symfony2, simplemente puede extender la compatibilidad de su servidor para el estándar json como se describe aquí: http://silex.sensiolabs.org/doc/cookbook/json_request_body.html
La forma Symfony2 (por ejemplo, dentro de su DefaultController):
La ventaja sería que no necesita usar jQuery param y podría usar AngularJS, su forma nativa de hacer tales solicitudes.
fuente
Respuesta completa (desde angular 1.4). Debe incluir la dependencia $ httpParamSerializer
fuente
En la configuración de tu aplicación:
Con su solicitud de recursos:
fuente
Esta no es una respuesta directa, sino una dirección de diseño ligeramente diferente:
No publique los datos como un formulario, sino como un objeto JSON que se asignará directamente al objeto del lado del servidor, o use la variable de ruta de estilo REST
Ahora sé que ninguna de las opciones podría ser adecuada en su caso, ya que está tratando de pasar una clave XSRF. Mapearlo en una variable de ruta como esta es un diseño terrible:
Porque, por naturaleza, también querría pasar la clave xsrf a otra ruta
/login
,/book-appointment
etc. y no querrás desordenar tu bonita URLCuriosamente, agregarlo como un campo de objeto tampoco es apropiado, porque ahora en cada objeto json que pasa al servidor, debe agregar el campo
Ciertamente no desea agregar otro campo en su clase del lado del servidor que no tenga una asociación semántica directa con el objeto de dominio.
En mi opinión, la mejor manera de pasar su clave xsrf es a través de un encabezado HTTP. Muchas bibliotecas de marco web del lado del servidor de protección xsrf lo admiten. Por ejemplo, en Java Spring, puede pasarlo usando el
X-CSRF-TOKEN
encabezado .La excelente capacidad de Angular de vincular objetos JS a objetos UI significa que podemos deshacernos de la práctica de publicar formularios todos juntos y publicar JSON en su lugar. JSON se puede deserializar fácilmente en objetos del lado del servidor y admitir estructuras de datos complejas como mapas, matrices, objetos anidados, etc.
¿Cómo publicar matriz en una carga útil de formulario? Tal vez así:
o esto:
Ambos tienen un diseño pobre.
fuente
Esto es lo que estoy haciendo para mi necesidad, donde necesito enviar los datos de inicio de sesión a la API como datos de formulario y el objeto Javascript (userData) se convierte automáticamente en datos codificados en URL
Así es como son mis datos de usuario
fuente
Lo único que debe cambiar es usar "parámetros" de propiedad en lugar de "datos" cuando cree su objeto $ http:
En el ejemplo anterior, los clientes [i] son solo objetos JSON (no serializados de ninguna manera). Si usa "params" en lugar de "data" angular, serializará el objeto por usted usando $ httpParamSerializer: https://docs.angularjs.org/api/ng/service/ $ httpParamSerializer
fuente
Use el
$http
servicio AngularJS y use supost
método o$http
función de configuración .fuente