14

以下$http requestは正常に実行されますが、反対側の PHP スクリプトは$_POST「test」と「testval」を受け取るべきときに空の配列を受け取ります。何か案は?

$http({
    url: 'backend.php',
    method: "POST",
    data: {'test': 'testval'},
    headers: {'Content-Type': 'application/x-www-form-urlencoded'}
    }).success(function (data, status, headers, config) {
    console.log(data);

    }).error(function (data, status, headers, config) {});
4

5 に答える 5

18

その単純なデータだけを送信したい場合は、これを試してください:

$http({
    url: 'backend.php',
    method: "POST",
    data: 'test=' + testval,
    headers: {'Content-Type': 'application/x-www-form-urlencoded'}
    }).success(function (data, status, headers, config) {
        console.log(data);

    }).error(function (data, status, headers, config) {});

そしてphp部分は次のようになります:

<?php
    $data = $_POST['test'];
    $echo $data;
?>

それは私のために働いています。

于 2014-01-06T13:32:44.380 に答える
7

より簡単な方法:

myApp.config(function($httpProvider) {
    $httpProvider.defaults.transformRequest = function(data) {        
        if (data === undefined) { return data; } 
        return $.param(data);
    };
    $httpProvider.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded; charset=UTF-8'; 
});
于 2014-07-17T13:23:01.793 に答える
7

これは AngularJS の一般的な問題です。

最初のステップは、 POSTリクエストのデフォルトのcontent-typeヘッダーを変更することです。

$http.defaults.headers.post["Content-Type"] = 
    "application/x-www-form-urlencoded; charset=UTF-8;";

次に、XHR リクエスト インターセプターを使用して、ペイロード オブジェクトを適切にシリアル化する必要があります。

$httpProvider.interceptors.push(['$q', function($q) {
    return {
        request: function(config) {
            if (config.data && typeof config.data === 'object') {
                // Check https://gist.github.com/brunoscopelliti/7492579 
                // for a possible way to implement the serialize function.
                config.data = serialize(config.data);
            }
            return config || $q.when(config);
        }
    };
}]);

このようにして、ペイロード データは$_POST配列で再び利用できるようになります。

XHR インターセプターの詳細については、 を参照してください。

もう 1 つの可能性として、デフォルトのcontent-typeヘッダーを維持し、サーバー側でペイロードを解析します。

if(stripos($_SERVER["CONTENT_TYPE"], "application/json") === 0) {
    $_POST = json_decode(file_get_contents("php://input"), true);
}
于 2013-11-20T17:33:30.547 に答える
3

Remove the following line, and the preceding comma:

headers: {'Content-Type': 'application/x-www-form-urlencoded'}

And then the data will appear in $_POST. You only need that line if you are uploading a file, in which case you'll have to decode the body to get the data vars.

于 2013-10-06T21:04:53.643 に答える
2

ここで解決策を見つけましたhttp://www.peterbe.com/plog/what-stumped-me-about-angularjs。「AJAXはjQueryのように機能しない」セクションにコードがあり、私の問題を解決しました。

于 2014-02-17T10:02:59.143 に答える