Angularjs $ http POST请求空数组

时间:2013-10-06 21:02:06

标签: javascript php angularjs

以下$http request成功执行,但另一端的PHP脚本在收到'test'和'testval'时会收到一个空的$_POST数组。有什么想法吗?

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

5 个答案:

答案 0 :(得分: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;
?>

这对我有用。

答案 1 :(得分:7)

这是AngularJS的常见问题。

第一步是更改 POST 请求的默认内容类型标头:

$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 interceptor的更多信息。

另一种可能性,是保留默认的 content-type 标头,然后服务器端解析有效负载:

if(stripos($_SERVER["CONTENT_TYPE"], "application/json") === 0) {
    $_POST = json_decode(file_get_contents("php://input"), true);
}

答案 2 :(得分: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'; 
});

答案 3 :(得分:3)

删除以下行和前面的逗号:

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

然后数据将出现在$ _POST中。如果要上传文件,则只需要该行,在这种情况下,您必须解码主体以获取数据变量。

答案 4 :(得分:2)

我在这里找到了我的解决方案http://www.peterbe.com/plog/what-stumped-me-about-angularjs。 “AJAX不像jQuery那样工作”部分中有一段代码,它解决了我的问题。