Angularjs $http POST 请求空数组

Posted

技术标签:

【中文标题】Angularjs $http POST 请求空数组【英文标题】:Angularjs $http POST request empty array 【发布时间】:2013-10-13 09:08:33 【问题描述】:

以下$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) );

【问题讨论】:

【参考方案1】:

如果你只想发送简单的数据,试试这个:

$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;
?>

它对我有用。

【讨论】:

我希望你能看看***.com/questions/34480438/…?我遇到的问题很相似,但与此线程中发布的问题有一些明显的不同。 谢谢。我在docs.angularjs.org/api/ng/service/$http 下使用Shortcut methods 下的示例:$http.get('/someUrl', config).then(successCallback, errorCallback); $http.post('/someUrl', data, config).then(successCallback, errorCallback); 这个问题的最佳答案很好地解释了它:***.com/questions/19254029/… 大家好,在我的情况下,仅更改标题不足以发送数据。我还覆盖了链接 corpus.hubwiz.com/2/angularjs/19254029.html 中指出的 transformRequest 方法,然后现在我成功地将数据发送到后端。【参考方案2】:

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

另一种可能,就是保留默认的content-type头,然后服务器端解析payload:

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

【讨论】:

【参考方案3】:

更简化的方式:

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

【讨论】:

你应该在诅咒 PHP【参考方案4】:

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

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

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

【讨论】:

感谢您的回复。不幸的是,我删除了这条线,但没有任何运气。我的 PHP 脚本中的 print_r($_POST) 命令仍然返回一个空数组。【参考方案5】:

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

【讨论】:

以上是关于Angularjs $http POST 请求空数组的主要内容,如果未能解决你的问题,请参考以下文章

AngularJS - $http.post 发送请求参数而不是 JSON 的任何方式?

Angularjs 获取 OPTIONS 和 POST 请求

AngularJS $http POST withCredentials 失败,请求正文中有数据

AJAX 中的 Http POST 请求完美运行,但在 AngularJS 中却不行

HTTP POST 变成 OPTIONS AngularJS

Angularjs `$http` 发送 POST 而不是 GET