108

タグ付きのフォームがありますng-submit="login()

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

PHP ファイルから 200 OK 応答が返ってきましたが、返されたデータはそれを示してemailおりpassword、未定義です。これは私が持っているすべてのphpです

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

未定義POSTの値を取得する理由は何ですか?

編集

これはよくある質問のようで(まだ古い)、非推奨になっているため、@James Gentesがコメントで指摘したように使用する必要があるため.success、指摘したかったのです.error.then

4

9 に答える 9

229

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())、JavascriptencodeURIComponent()がそのトリックを実行するはずです。

于 2013-03-18T19:54:40.593 に答える
41

私はサーバー側でそれを行います.initファイルの冒頭で、魅力的に機能し、Angularまたは既存のphpコードで何もする必要はありません:

if ($_SERVER['REQUEST_METHOD'] == 'POST' && empty($_POST))
    $_POST = json_decode(file_get_contents('php://input'), true);
于 2014-06-10T12:25:20.510 に答える
11

PHP は JSON をネイティブに受け入れないため、'application/json'1 つのアプローチは、API がデータを直接使用できるように、ヘッダーとパラメーターを angular から更新することです。

まず、データをパラメータ化します。

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';
});
于 2014-05-22T19:01:59.840 に答える
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);

?>

Angular の動作のため、PHP サーバーで通常の投稿動作を行うための直接的な方法はありません。そのため、json オブジェクトで管理する必要があります。

于 2014-06-27T06:46:54.600 に答える
6

これは、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"];
?>
于 2015-03-11T14:31:05.520 に答える
6

フォーム データを .post () の 2 番目のパラメーターとして渡す前に、逆シリアル化する必要があります。これは、jQuery の $.param (data) メソッドを使用して実現できます。次に、サーバー側で $.POST ['email']; のように参照できるようになります。

于 2014-03-18T00:02:42.790 に答える
5

これは古い質問ですが、Angular 1.4 では $httpParamSerializer が追加され、$http.post を使用するときに $httpParamSerializer(params) を使用してパラメーターを渡すと、すべてが通常の投稿要求のように機能し、JSON の逆シリアル化は行われないことに言及する価値があります。サーバー側で必要です。

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

于 2015-06-17T02:34:42.157 に答える