[php] PHP에 AngularJS HTTP 게시 및 정의되지 않음

태그가있는 양식이 있습니다. ng-submit="login()

이 함수는 자바 스크립트에서 잘 호출됩니다.

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');
        });
    }
}

나는 PHP 파일에서 200 OK 응답 등을 얻고있다, 그러나, 반환 된 데이터는 것을 말하고 emailpassword정의되지 않은 있습니다. 이것은 내가 가진 모든 PHP입니다

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

왜 내가 정의되지 않은 POST값을 얻는 지 아십니까?

편집하다

나는이 (아직 나이입니다) 인기 질문 것으로 보인다 이후 지적하고 싶었, .success그리고 .error사용되지 않으며 당신은 사용해야 .then@ 제임스 씨족이 commments에서 지적



답변

angularjs는 .post()기본적으로 Content-type 헤더를 application/json. 양식으로 인코딩 된 데이터를 전달하기 위해 이것을 재정의하고 있지만 data적절한 쿼리 문자열을 전달하도록 값을 변경하지 않으므로 PHP가 $_POST예상대로 채워지지 않습니다 .

내 제안은 기본 angularjs 설정을 application/json헤더로 사용하고 PHP에서 원시 입력을 읽은 다음 JSON을 역 직렬화하는 것입니다.

다음과 같이 PHP에서 수행 할 수 있습니다.

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

또는 $_POST기능에 크게 의존하는 경우 다음 과 같은 쿼리 문자열 email=someemail@email.com&password=somepassword을 구성하여 데이터로 보낼 수 있습니다. 이 쿼리 문자열이 URL로 인코딩되었는지 확인하십시오. 수동으로 빌드하는 경우 (같은 것을 사용하는 것과는 반대로 jQuery.serialize()) Javascript가 encodeURIComponent()트릭을 수행해야합니다.


답변

init 파일의 시작 부분에서 서버 측에서 수행하며 매력처럼 작동하며 각도 또는 기존 PHP 코드에서 아무것도 할 필요가 없습니다.

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


답변

API에서 개발 중이며 기본 컨트롤러가 있고 __construct () 메서드 내부에 다음이 있습니다.

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));
}

이렇게하면 필요할 때 json 데이터를 $ _POST [ “var”]로 간단히 참조 할 수 있습니다. 잘 작동합니다.

이렇게하면 인증 된 사용자가 기본 Content-Type : application / x-www-form-urlencoded 또는 Content-Type : application / json을 사용하여 게시 데이터를 보내는 jQuery와 같은 라이브러리에 연결하면 API가 오류없이 응답하고 API를 좀 더 개발자 친화적으로 만듭니다.

도움이 되었기를 바랍니다.


답변

PHP는 기본적으로 JSON을 허용하지 않기 때문에 'application/json'API가 데이터를 직접 사용할 수 있도록 앵귤러에서 헤더와 매개 변수를 업데이트하는 것입니다.

먼저 데이터를 매개 변수화합니다.

data: $.param({ "foo": $scope.fooValue })

그런 다음 다음을 귀하의$http

 headers: {
     'Content-Type' : 'application/x-www-form-urlencoded; charset=UTF-8'
 }, 

모든 요청이 PHP로 이동하는 경우 다음과 같이 구성에서 매개 변수를 전역으로 설정할 수 있습니다.

myApp.config(function($httpProvider) {
    $httpProvider.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded; charset=UTF-8';
});


답변

Angular Js 데모 코드 :-

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);
        });

        }]);

서버 측 코드 :-

<?php


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

?>

각도 동작으로 인해 PHP 서버에서 일반적인 포스트 동작에 대한 직접적인 방법이 없으므로 json 객체에서 관리해야합니다.


답변

.post ()에 두 번째 매개 변수로 전달하기 전에 양식 데이터를 역 직렬화해야합니다. jQuery의 $ .param (데이터) 메서드를 사용하여이를 수행 할 수 있습니다. 그러면 서버 측에서 $ .POST [ ’email’]과 같이 참조 할 수 있습니다.


답변

이것은 jQuery와 JSON 디코딩이 필요하지 않기 때문에 최상의 솔루션 (IMO)입니다.

출처 :
https://wordpress.stackexchange.com/a/179373
및 : https://stackoverflow.com/a/1714899/196507

요약:

//Replacement of jQuery.param
var serialize = function(obj, prefix) {
  var str = [];
  for(var p in obj) {
    if (obj.hasOwnProperty(p)) {
      var k = prefix ? prefix + "[" + p + "]" : p, v = obj[p];
      str.push(typeof v == "object" ?
        serialize(v, k) :
        encodeURIComponent(k) + "=" + encodeURIComponent(v));
    }
  }
  return str.join("&");
};

//Your AngularJS application:
var app = angular.module('foo', []);

app.config(function ($httpProvider) {
    // send all requests payload as query string
    $httpProvider.defaults.transformRequest = function(data){
        if (data === undefined) {
            return data;
        }
        return serialize(data);
    };

    // set all post requests content type
    $httpProvider.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded; charset=UTF-8';
});

예:

...
   var data = { id: 'some_id', name : 'some_name' };
   $http.post(my_php_url,data).success(function(data){
        // It works!
   }).error(function() {
        // :(
   });

PHP 코드 :

<?php
    $id = $_POST["id"];
?>