복붙노트

PHP에 대한 각도 HTTP 게시 및 정의되지 않음

PHP

PHP에 대한 각도 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 응답을받습니다. 그러나 반환 된 데이터는 전자 메일과 암호가 정의되지 않았 음을 나타냅니다. 이것은 내가 가진 모든 PHP이다.

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

정의되지 않은 POST 값을 얻는 이유는 무엇입니까?

편집하다

나는 이것이 대중적인 질문 인 것처럼 보이기 때문에 지적하고 싶다. (아직 오래된 것이다.) .success와 .error는 더 이상 사용되지 않으며, @James Gentes가 commments에서 지적했듯이 사용해야한다.

해결법

  1. ==============================

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

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

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

    이것은 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 ()가 트릭을 수행해야합니다.

  2. ==============================

    2.나는 서버 쪽에서 init 파일을 시작할 때 매력을 느끼기 때문에 앵글 또는 기존 PHP 코드에서 아무 것도 할 필요가 없다.

    나는 서버 쪽에서 init 파일을 시작할 때 매력을 느끼기 때문에 앵글 또는 기존 PHP 코드에서 아무 것도 할 필요가 없다.

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

    3.API에서 나는 기본 컨트롤러를 가지고 있으며 __construct () 메서드 내부에 다음과 같은 것들이 있습니다.

    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를 개발자에게 좀 더 친숙하게 만듭니다.

    희망이 도움이됩니다.

  4. ==============================

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

    PHP는 기본적으로 JSON 'application / json'을 허용하지 않기 때문에 API와 헤더를 매개 변수로 업데이트하여 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';
    });
    
  5. ==============================

    5.Angular Js 데모 코드 : -

    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 객체에서이를 관리해야합니다.

  6. ==============================

    6..post ()에 두 번째 매개 변수로 전달하기 전에 양식 데이터를 deserialize해야합니다. 이를 위해 jQuery의 $ .param (data) 메소드를 사용하면된다. 그러면 서버 측에서 $ .POST [ 'email'];를 참조 할 수 있습니다.

    .post ()에 두 번째 매개 변수로 전달하기 전에 양식 데이터를 deserialize해야합니다. 이를 위해 jQuery의 $ .param (data) 메소드를 사용하면된다. 그러면 서버 측에서 $ .POST [ 'email'];를 참조 할 수 있습니다.

  7. ==============================

    7.이것은 jQuery가 필요없고 JSON 디코드가 필요 없기 때문에 최고의 솔루션 (IMO)입니다.

    이것은 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"];
    ?>
    
  8. ==============================

    8.오래된 질문이지만 Angular 1.4 $ httpParamSerializer가 추가되었고 $ http.post를 사용할 때 매개 변수를 전달하기 위해 $ httpParamSerializer (params)를 사용하면 모든 것이 일반적인 게시물 요청처럼 작동하고 JSON 역 직렬화는 없습니다. 서버 측에서 필요합니다.

    오래된 질문이지만 Angular 1.4 $ httpParamSerializer가 추가되었고 $ http.post를 사용할 때 매개 변수를 전달하기 위해 $ httpParamSerializer (params)를 사용하면 모든 것이 일반적인 게시물 요청처럼 작동하고 JSON 역 직렬화는 없습니다. 서버 측에서 필요합니다.

    https://docs.angularjs.org/api/ng/service/$httpParamSerializer

  9. ==============================

    9.Angular와 PHP로 작업하는 동안 그것을 이해하는 데 몇 시간이 걸렸습니다. $ _POST에서 POST 데이터가 PHP로 전송되지 않았습니다.

    Angular와 PHP로 작업하는 동안 그것을 이해하는 데 몇 시간이 걸렸습니다. $ _POST에서 POST 데이터가 PHP로 전송되지 않았습니다.

    PHP 코드에서 다음을 수행하십시오. - $ angular_post_params 변수를 만듭니다. - 다음과 같이하십시오. $ angular_http_params = (배열) json_decode (trim (file_get_contents ( 'php : // input'))));

    이제 $ _POST에서와 같이 매개 변수에 액세스 할 수 있습니다.

    $ angular http params [ "key"]

    혹시 자바 스크립트에 대해 궁금해하신다면 ....

        var myApp = angular.module('appUsers', []);
        //var post_params = $.param({ request_type: "getListOfUsersWithRolesInfo" });
        var dataObj = {
            task_to_perform: 'getListOfUsersWithRolesInfo'
        };
    
        myApp.controller('ctrlListOfUsers', function ($scope, $http) {
            $http({
                method: 'POST',
                dataType: 'json',
                url: ajax_processor_url,
                headers: {
                    'Content-Type': 'application/json'
                },
                data: dataObj,
                //transformRequest: function(){},
                timeout: 30000,
                cache: false
            }).
            success(function (rsp) {
                console.log("success");
                console.log(rsp);
            }).
            error(function (rsp) {
                console.log("error");
            });
        });
    
  10. from https://stackoverflow.com/questions/15485354/angular-http-post-to-php-and-undefined by cc-by-sa and MIT license