108 votes

Angulaire HTTP post pour PHP et indéfini

J'ai un formulaire avec le tag ng-submit="login()

La fonction est appelée fine en javascript.

function LoginForm($scope, $http)
{
    $http.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded; charset=UTF-8';

    $scope.email    = "fsdg@sdf.com";
    $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');
        });
    }
}

Je reçois une réponse 200 OK de retour à partir du fichier PHP, cependant, les données renvoyées dit qu' email et password ne sont pas définis. C'est tout le php, j'ai

<?php
$email = $_POST['email'];
$pass  = $_POST['password'];
echo $email;
?>

Aucune idée de pourquoi je suis undefined POST valeurs?

229voto

Mike Brant Points 39322

angularjs .post() valeurs par défaut de l'entête Content-type d' application/json. Vous êtes à la substitution de ce passer la forme des données codées, cependant vous ne modifiez pas votre data de la valeur à transmettre une requête appropriée de la chaîne, de sorte que PHP n'est pas le remplissage d' $_POST que vous attendez.

Ma suggestion serait d'utiliser la valeur par défaut angularjs réglage de l' application/json comme en-tête, lire le raw d'entrée en PHP, puis désérialiser le JSON.

Qui peut être réalisé en PHP comme ceci:

$postdata = file_get_contents("php://input");
$request = json_decode($postdata);
$email = $request->email;
$pass = $request->password;

Alternativement, si vous êtes fortement en s'appuyant sur $_POST fonctionnalité, vous pouvez former une chaîne de requête comme email=someemail@email.com&password=somepassword et l'envoyer en tant que données. Assurez-vous que cette chaîne de requête de l'URL encodée. Si fabriqués manuellement (par opposition à l'aide de quelque chose comme jQuery.serialize()), du Javascript encodeURIComponent() devrait faire l'affaire pour vous.

41voto

valmarv Points 91

Je le fais sur le côté serveur, au début de mon fichier init, fonctionne comme un charme et que vous n'avez pas à faire quoi que ce soit dans angulaire ou existantes du code php:

if ($_SERVER['REQUEST_METHOD'] == 'POST' && empty($_POST))
    $_POST = json_decode(file_get_contents('php://input'), true);

15voto

TimWickstrom.com Points 1576

Dans l'API, je suis en train d'élaborer j'ai un contrôleur de base et à l'intérieur de son __construct() méthode que j'ai suivantes:

if(isset($_SERVER["CONTENT_TYPE"]) && strpos($_SERVER["CONTENT_TYPE"], "application/json") !== false) {
    $_POST = array_merge($_POST, (array) json_decode(trim(file_get_contents('php://input')), true));
}

Cela me permet tout simplement de référence les données json $_POST["var"] en cas de besoin. Fonctionne très bien.

De cette façon, si un utilisateur authentifié se connecte avec une bibliothèque telle jQuery qui envoie des données post avec un défaut de Content-Type: application/x-www-form-urlencoded ou Content-Type: application/json l'API de répondre sans erreur et fera l'API un peu plus de développeur sympathique.

Espérons que cette aide.

8voto

Rajendra Khabiya Points 770

Angular Js Code De Démonstration :-

angular.module('ModuleName',[]).controller('main', ['$http', function($http){

                var formData = { password: 'test pwd', email : 'test email' };
                var postData = 'myData='+JSON.stringify(formData);
                $http({
                        method : 'POST',
                        url : 'resources/curl.php',
                        data: postData,
                        headers : {'Content-Type': 'application/x-www-form-urlencoded'}  

                }).success(function(res){
                        console.log(res);
                }).error(function(error){
                        console.log(error);
        });

        }]);

Côté Serveur Code:

<?php


// it will print whole json string, which you access after json_enocde in php
$myData = json_decode($_POST['myData']);
print_r($myData);

?>

En raison angulaire de comportement il n'existe pas de méthode directe pour le post de comportement au serveur PHP, de sorte que vous avez à gérer en objets json.

6voto

user3431093 Points 21

Vous avez besoin de désérialiser votre formulaire de données avant de les transmettre en tant que second paramètre .post (). Vous pouvez réaliser cela à l'aide de jQuery $.param (données) de la méthode. Ensuite, vous serez en mesure de sur le côté serveur de référence comme $.POST ['email'];

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X