Tengo un código antiguo que está haciendo una solicitud POST AJAX a través del método de publicación de jQuery y se parece a esto:
$.post("/foo/bar", requestData,
function(responseData)
{
//do stuff with response
}
requestData
es solo un objeto javascript con algunas propiedades básicas de cadena.
Estoy en el proceso de mover nuestras cosas para usar Angular, y quiero reemplazar esta llamada con $ http.post. Se me ocurrió lo siguiente:
$http.post("/foo/bar", requestData).success(
function(responseData) {
//do stuff with response
}
});
Cuando hice esto, obtuve una respuesta de error 500 del servidor. Usando Firebug, descubrí que esto envió el cuerpo de la solicitud de esta manera:
{"param1":"value1","param2":"value2","param3":"value3"}
El jQuery exitoso $.post
envía el cuerpo así:
param1=value1¶m2=value2¶m3=value3
El punto final al que estoy llegando espera parámetros de solicitud y no JSON. Entonces, mi pregunta es, ¿hay alguna forma de decirle $http.post
que envíe el objeto javascript como parámetros de solicitud en lugar de JSON? Sí, sé que podría construir la cadena yo mismo a partir del objeto, pero quiero saber si Angular proporciona algo para esto fuera de la caja.
fuente
$httpProvider.defaults
, entonces no funciona, ¿alguna pista sobre esto?Cannot read property "jquery" of undefined.
¿Cómo puedo solucionar este problema? PD. Las transformaciones por llamada funcionan.Si usa Angular> = 1.4 , aquí está la solución más limpia que he encontrado que no depende de nada personalizado o externo:
Y luego puedes hacer esto en cualquier lugar de tu aplicación:
Y serializará correctamente los datos
param1=value1¶m2=value2
y los enviará/requesturl
con elapplication/x-www-form-urlencoded; charset=utf-8
encabezado Content-Type como normalmente se espera con las solicitudes POST en los puntos finales.fuente
De la documentación de AngularJS:
Por lo tanto, proporcione cadenas como parámetros. Si no quieres eso, usa transformaciones. Nuevamente, de la documentación:
Consulte la documentación para obtener más detalles.
fuente
Utilice la
$.param
función de jQuery para serializar los datos JSON en requestData.En resumen, usando un código similar al suyo:
Para usar esto, debe incluir jQuery en su página junto con AngularJS.
fuente
Tenga en cuenta que a partir de Angular 1.4, puede serializar los datos del formulario sin usar jQuery.
En app.js:
Luego en tu controlador:
fuente
Esto podría ser un truco, pero evité el problema y convertí el json en la matriz POST de PHP en el lado del servidor:
fuente
También tengo problemas con la configuración de la autenticación http personalizada porque $ resource cache la solicitud.
Para que funcione, debe sobrescribir los encabezados existentes haciendo esto
Espero haber podido ayudar a alguien. Me tomó 3 días resolver esto.
fuente
Modifique los encabezados predeterminados:
Luego usa el
$.param
método de JQuery :fuente
fuente
Ajuste rápido: para aquellos de ustedes que tengan problemas con la configuración global de la función transformRequest, aquí está el fragmento que estoy usando para deshacerme del
Cannot read property 'jquery' of undefined
error:fuente
También puede resolver este problema sin cambiar el código en el servidor, cambiar el encabezado en la
$http.post
llamada y usar$_POST
la forma habitual. Explicado aquí: http://victorblog.com/2012/12/20/make-angularjs-http-service-behave-like-jquery-ajax/fuente
Encontré muchas veces el comportamiento problemático de este conjunto. Lo usé de express (sin tipificaciones) y bodyParser (con las tipificaciones dt ~ body-parser).
No intenté cargar un archivo, sino simplemente interpretar un JSON dado en una cadena de publicación.
El
request.body
era simplemente un json ({}
) vacío .Después de mucha investigación, finalmente esto funcionó para mí:
También puede ser importante proporcionar el
application/json
tipo de contenido en la cadena de solicitud desde el lado del cliente.fuente
Sintaxis para AngularJS v1.4.8 + (v1.5.0)
P.ej:
fuente