¿Alguien podría decirme por qué la siguiente declaración no envía los datos de la publicación a la URL designada? La url se llama pero en el servidor cuando imprimo $ _POST: obtengo una matriz vacía. Si imprimo un mensaje en la consola antes de agregarlo a los datos, muestra el contenido correcto.
$http.post('request-url', { 'message' : message });
También lo probé con los datos como cadena (con el mismo resultado):
$http.post('request-url', "message=" + message);
Parece estar funcionando cuando lo uso en el siguiente formato:
$http({
method: 'POST',
url: 'request-url',
data: "message=" + message,
headers: {'Content-Type': 'application/x-www-form-urlencoded'}
});
pero ¿hay alguna manera de hacerlo con $ http.post (), y ¿siempre tengo que incluir el encabezado para que funcione? Creo que el tipo de contenido anterior especifica el formato de los datos enviados, pero ¿puedo enviarlo como objeto javascript?
angularjs
post
angular-http
Spencer Mark
fuente
fuente
Respuestas:
Tuve el mismo problema usando asp.net MVC y encontré la solución aquí
Funciona de maravilla.
CÓDIGO
fuente
bower install angular-post-fix --save-dev
para agregarlo.No está muy claro arriba, pero si está recibiendo la solicitud en PHP, puede usar:
$params = json_decode(file_get_contents('php://input'),true);
Para acceder a una matriz en PHP desde un AngularJS POST.
fuente
json_decode(file_get_contents('php://input'), true);
Puede establecer el "Tipo de contenido" predeterminado de esta manera:
Sobre el
data
formato:Intenta usar esta variación
fuente
He tenido un problema similar y me pregunto si esto también puede ser útil: https://stackoverflow.com/a/11443066
Saludos,
fuente
Me gusta usar una función para convertir objetos para publicar parámetros.
fuente
Esto finalmente se ha abordado en 1.4 angular usando $ httpParamSerializerJQLike
Ver https://github.com/angular/angular.js/issues/6039
fuente
Yo uso jQuery param con AngularJS post requrest. Aquí hay un ejemplo ... cree el módulo de aplicación AngularJS, donde
myapp
se define conng-app
su código HTML.Ahora permítanos crear un controlador de inicio de sesión y enviar correo electrónico y contraseña.
No me gusta explicar el código, es bastante simple de entender :) Tenga en cuenta que
param
es de jQuery, por lo que debe instalar jQuery y AngularJS para que funcione. Aquí hay una captura de pantalla.Espero que esto sea útil. ¡Gracias!
fuente
Tuve el mismo problema con AngularJS y Node.js + Express 4 + Router
El enrutador espera los datos de la solicitud de la publicación en el cuerpo. Este cuerpo siempre estaba vacío si seguía el ejemplo de Angular Docs
Notación 1
Pero si lo usé en los datos
Notación 2
Editar 1:
De lo contrario, el enrutador node.js esperará los datos en req.body si se usa la notación 1:
Que también envía la información como carga JSON. Esto es mejor en algunos casos en los que tiene matrices en su json y x-www-form-urlencoded dará algunos problemas.
funcionó. Espero eso ayude.
fuente
A diferencia de JQuery y por el bien de la pedantería, Angular usa el formato JSON para la transferencia de datos POST de un cliente al servidor (JQuery aplica x-www-form-urlencoded presumiblemente, aunque JQuery y Angular usan JSON para la entrada de datos). Por lo tanto, hay dos partes del problema: en la parte del cliente js y en la parte del servidor. Así que tú necesitas:
poner parte del cliente angular js así:
Y
escriba en la parte de su servidor para recibir datos de un cliente (si es php).
Nota: ¡$ _POST no funcionará!
La solución funciona bien para mí, con suerte, y para ti.
fuente
Para enviar datos a través del método Post con
$http
angularjs, debe cambiardata: "message=" + message
, condata: $.param({message:message})
fuente
Para construir sobre la respuesta de @ felipe-miosso:
Agréguelo a su aplicación:
fuente
No tengo la reputación de comentar, pero en respuesta / además de la respuesta de Don F:
$params = json_decode(file_get_contents('php://input'));
Se
true
debe agregar un segundo parámetro de a lajson_decode
función para devolver correctamente una matriz asociativa:$params = json_decode(file_get_contents('php://input'), true);
fuente
Angular
WebAPI 2
fuente
Este código resolvió el problema para mí. Es una solución a nivel de aplicación:
fuente
Agregue esto en su archivo js:
y agregue esto a su archivo de servidor:
Eso debería funcionar.
fuente
También enfrenté un problema similar y estaba haciendo algo como esto y eso no funcionó. Mi controlador Spring no pudo leer el parámetro de datos.
Pero al leer este foro y API Doc, intenté seguirlo y funcionó para mí. Si alguien también tiene un problema similar, también puede intentarlo a continuación.
Consulte https://docs.angularjs.org/api/ng/service/ $ http # post para saber qué hace param config. {data: '"id": "1"'} - Mapa de cadenas u objetos que se convertirán en URL? data = "id: 1"
fuente
Esta es probablemente una respuesta tardía, pero creo que la forma más adecuada es usar el mismo código de uso angular al hacer una solicitud de "obtención",
$httpParamSerializer
tendrá que inyectarlo en su controlador para que pueda hacer lo siguiente sin tener que usar Jquery en absoluto,$http.post(url,$httpParamSerializer({param:val}))
fuente
En mi caso, resuelvo el problema así:
Debe usar JSON.stringify para cada parámetro que contiene un objeto JSON y luego construir su objeto de datos con "$ .param" :-)
NB: Mi "objJSON" es un objeto JSON que contiene contenido de matriz, entero, cadena y html. Su tamaño total es> 3500 caracteres.
fuente
Sé que ha aceptado la respuesta. Pero, seguir podría ayudar a futuros lectores, si la respuesta no les conviene por alguna razón.
Angular no hace ajax lo mismo que jQuery. Mientras intentaba seguir la guía para modificar angular
$httpprovider
, encontré otros problemas. Por ejemplo, uso codeigniter en el que la$this->input->is_ajax_request()
función siempre fallaba (que fue escrita por otro programador y utilizada globalmente, por lo que no puedo cambiar) diciendo que esta no era una solicitud real de ajax.Para resolverlo, tomé la ayuda de la promesa diferida . Lo probé en Firefox, y ie9 y funcionó.
Tengo la siguiente función definida fuera de cualquiera de los códigos angulares. Esta función realiza una llamada regular jquery ajax y devuelve el objeto diferido / promesa (todavía estoy aprendiendo).
Entonces lo llamo código angular usando el siguiente código. Tenga en cuenta que tenemos que actualizar el
$scope
manual usando$scope.$apply()
.Puede que esta no sea la respuesta perfecta, pero me permitió usar llamadas jquery ajax con angular y me permitió actualizar el
$scope
.fuente
Tuve el mismo problema en express ... para resolverlo, debe usar bodyparser para analizar objetos json antes de enviar solicitudes http ...
fuente
Espero eso ayude.
fuente
No encontré un fragmento de código completo sobre cómo usar el método $ http.post para enviar datos al servidor y por qué no funcionaba en este caso.
Explicaciones del fragmento de código a continuación ...
Establecer el tipo de contenido en la variable de configuración que se pasará junto con la solicitud de angularJS $ http.post que le indica al servidor que estamos enviando datos en formato de publicación www.
Observe el método $ htttp.post, donde estoy enviando el primer parámetro como url, el segundo parámetro como datos (serializados) y el tercer parámetro como config.
El código restante se entiende a sí mismo.
Mira el ejemplo de código del método $ http.post aquí .
fuente
Si usa PHP, esta es una manera fácil de acceder a una matriz en PHP desde un POST AngularJS.
fuente
Si usa Angular> = 1.4 , esta es la solución más limpia que usa el serializador proporcionado por Angular :
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.TL; DR
Durante mi investigación descubrí que la respuesta a este problema viene en muchos sabores diferentes; algunos son muy intrincados y dependen de funciones personalizadas, algunos dependen de jQuery y algunos son incompletos al sugerir que solo necesita establecer el encabezado.
Si solo establece el
Content-Type
encabezado, el punto final verá los datos POST, pero no estará en el formato estándar porque a menos que proporcione una cadena como sudata
, o serialice manualmente su objeto de datos, todo será serializado como JSON por predeterminado y puede interpretarse incorrectamente en el punto final.por ejemplo, si el serializador correcto no se configuró en el ejemplo anterior, se vería en el punto final como:
Y eso puede conducir a un análisis inesperado, por ejemplo, ASP.NET lo trata como un
null
nombre de parámetro, con un{"param1":"value1","param2":"value2"}
valor; o Fiddler lo interpreta de otra manera, con{"param1":"value1","param2":"value2"}
el nombre del parámetro ynull
el valor.fuente
Similar al formato de trabajo sugerido por el OP y la respuesta de Denison, excepto el uso en
$http.post
lugar de solo$http
y todavía depende de jQuery.Lo bueno de usar jQuery aquí es que los objetos complejos se pasan correctamente; contra la conversión manual en parámetros de URL que pueden confundir los datos.
fuente
Cuando tuve este problema, el parámetro que estaba publicando resultó ser una matriz de objetos en lugar de un simple objeto.
fuente
Recién actualizado de angular 1.2 a 1.3, he encontrado un problema en el código. La transformación de un recurso conducirá a un bucle sin fin porque (creo) que la promesa de $ retiene el mismo objeto. Tal vez ayude a alguien ...
Podría arreglar eso de la siguiente manera:
fuente
He estado usando el código de respuesta aceptado (código de Felipe) por un tiempo y ha estado funcionando muy bien (¡gracias, Felipe!).
Sin embargo, recientemente descubrí que tiene problemas con objetos vacíos o matrices. Por ejemplo, al enviar este objeto:
PHP no parece ver B y C en absoluto. Se pone esto:
Un vistazo a la solicitud real en Chrome muestra esto:
Escribí un fragmento de código alternativo. Parece funcionar bien con mis casos de uso, pero no lo he probado exhaustivamente, así que úselo con precaución.
Usé TypeScript porque me gusta la escritura fuerte pero sería fácil convertir a JS puro:
Es menos eficiente que el código de Felipe, pero no creo que importe mucho, ya que debería ser inmediato en comparación con la sobrecarga general de la solicitud HTTP.
Ahora PHP muestra:
Hasta donde sé, no es posible hacer que PHP reconozca que Ba y C son matrices vacías, pero al menos aparecen las claves, lo cual es importante cuando hay código que se basa en una determinada estructura, incluso cuando está esencialmente vacío por dentro.
También tenga en cuenta que convierte s indefinidos y nulos en cadenas vacías.
fuente
Simplemente ponga los datos que desea enviar como segundo parámetro:
Otra forma que también funciona es:
Asegúrese de que
paramName
coincida exactamente con el nombre del parámetro de la función que está llamando.Fuente: método de acceso directo posterior a AngularJS
fuente
Resolví esto con los siguientes códigos:
Lado del cliente (Js):
Observe que los datos son un objeto.
En el servidor (ASP.NET MVC):
y 'AllowCrossSiteJsonAttribute' es necesario para solicitudes de dominio cruzado:
Espero que esto haya sido útil.
fuente