Tengo un formulario con la etiqueta ng-submit="login()
La función se llama bien en javascript.
function LoginForm($scope, $http)
{
$http.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded; charset=UTF-8';
$scope.email = "[email protected]";
$scope.password = "1234";
$scope.login = function()
{
data = {
'email' : $scope.email,
'password' : $scope.password
};
$http.post('resources/curl.php', data)
.success(function(data, status, headers, config)
{
console.log(status + ' - ' + data);
})
.error(function(data, status, headers, config)
{
console.log('error');
});
}
}
Recibo una respuesta 200 OK del archivo PHP, sin embargo, los datos devueltos dicen eso email
y password
no están definidos. Este es todo el php que tengo
<?php
$email = $_POST['email'];
$pass = $_POST['password'];
echo $email;
?>
¿Alguna idea de por qué obtengo POST
valores indefinidos ?
EDITAR
Quería señalar ya que esta parece ser una pregunta popular (pero es antigua), .success
y .error
ha sido obsoleta y debería usarla .then
como @James Gentes señaló en los comentarios.
php
javascript
angularjs
Ronnie
fuente
fuente
$http
?Form-Data
dice{"email":"[email protected]","password":"1234"}
print_r($_POST);
y luego pruebajson_decode()
con el índice correctoecho 'test';
funciona bien. Ciertamente estoy señalando el archivo correctoRespuestas:
angularjs
.post()
predetermina el encabezado de tipo de contenido aapplication/json
. Está anulando esto para pasar datos codificados por formulario, sin embargo, no está cambiando sudata
valor para pasar una cadena de consulta adecuada, por lo que PHP no se está completando$_POST
como esperaba.Mi sugerencia sería usar la configuración predeterminada de angularjs
application/json
como encabezado, leer la entrada sin procesar en PHP y luego deserializar el JSON.Eso se puede lograr en PHP de esta manera:
Alternativamente, si confía en gran medida en la
$_POST
funcionalidad, puede formar una cadena de consulta como[email protected]&password=somepassword
y enviarla como datos. Asegúrese de que esta cadena de consulta esté codificada como URL. Si se construye manualmente (en lugar de usar algo comojQuery.serialize()
), JavascriptencodeURIComponent()
debería hacer el truco por usted.fuente
file_get_contents("php://input");
parece una especie de truco, ¿no? Nunca he oído hablar de esto. Lo que debe suceder para que pueda hacer referencia a él como$_POST['email'];
$_POST
que no se completará.Lo hago en el lado del servidor, al comienzo de mi archivo de inicio, funciona como un encanto y no tienes que hacer nada en el código php angular o existente:
fuente
$_POST = (array) json_decode(file_get_contents('php://input'), true)
.$_POST
terminaría obteniendo una matriz indexada numéricamente en estos casos, algo que sería un comportamiento muy inesperado en otra parte del sistema que se basa en un$_POST
comportamiento superglobal consistente .En la API que estoy desarrollando tengo un controlador base y dentro de su método __construct () tengo lo siguiente:
Esto me permite simplemente hacer referencia a los datos json como $ _POST ["var"] cuando sea necesario. Funciona genial.
De esa manera, si un usuario autenticado se conecta con una biblioteca como jQuery que envía datos de publicación con un valor predeterminado de Content-Type: application / x-www-form-urlencoded o Content-Type: application / json, la API responderá sin errores y hacer que la API sea un poco más amigable para los desarrolladores.
Espero que esto ayude.
fuente
Debido a que PHP no acepta JSON de forma nativa,
'application/json'
un enfoque es actualizar sus encabezados y parámetros desde angular para que su api pueda usar los datos directamente.Primero , parametrice sus datos:
Luego , agregue lo siguiente a su
$http
Si todas sus solicitudes van a PHP, los parámetros se pueden establecer globalmente en la configuración de la siguiente manera:
fuente
Código de demostración de Angular Js: -
Código del lado del servidor: -
Debido al comportamiento angular, no existe un método directo para el comportamiento de publicación normal en el servidor PHP, por lo que debe administrarlo en objetos json.
fuente
.success
y.error
están en desuso y se han eliminado del marco AngularJS.Necesita deserializar los datos de su formulario antes de pasarlos como segundo parámetro a .post (). Puede lograr esto usando el método $ .param (data) de jQuery. Entonces podrá en el lado del servidor hacer referencia a él como $ .POST ['email'];
fuente
Esta es la mejor solución (IMO) ya que no requiere jQuery ni decodificación JSON:
Fuente: https://wordpress.stackexchange.com/a/179373 y: https://stackoverflow.com/a/1714899/196507
Resumen:
Ejemplo:
Código PHP:
fuente
JSON.stringify('{ id: 'some_id', name : 'some_name' }')
o$httpParamSerializer
para la conversión del lado del cliente?Es una pregunta antigua, pero vale la pena mencionar que en Angular 1.4 se agrega $ httpParamSerializer y cuando usamos $ http.post, si usamos $ httpParamSerializer (params) para pasar los parámetros, todo funciona como una solicitud de publicación normal y no se deserializa JSON necesario en el lado del servidor.
https://docs.angularjs.org/api/ng/service/$httpParamSerializer
fuente
Me tomó horas entender eso mientras trabajaba con Angular y PHP. Los datos de publicación no iban a PHP en $ _POST
en código PHP, haga lo siguiente. - Cree una variable $ angular_post_params - Luego haga lo siguiente
$angular_http_params = (array)json_decode(trim(file_get_contents('php://input')));
ahora puede acceder a sus parámetros como lo hace desde $ _POST
$angular_http_params["key"]
en caso de que se esté preguntando acerca de javascript ... esto es lo que usé
fuente
.success
y.error
están en desuso y se han eliminado del marco AngularJS.