AngularJS HTTP post to PHP and undefined AngularJS is a popular JavaScript framework used for building web applications. One of its features is the ability to make HTTP requests to a server. In this case, we are specifically looking at how to make a POST
AngularJS HTTP post to PHP and undefined AngularJS is a popular JavaScript framework used for building web applications. One of its features is the ability to make HTTP requests to a server. In this case, we are specifically looking at how to make a POST
表单中有一个标签ng-submit=\"login()
。\n该函数在JavaScript中被正常调用。\n
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'); }); } }
\n我从PHP文件中得到了一个200 OK的响应,但返回的数据说email
和password
未定义。这是我所有的PHP代码\n
\n为什么我得到了未定义的POST
值?\n编辑\n我想指出,由于这个问题似乎很受欢迎(尽管它已经过时),.success
和.error
已经被弃用,你应该使用.then
,正如@James Gentes在评论中指出的那样。
问题的原因是在API的基础控制器中,使用了如上述的代码来将post数据以json格式解析到$_POST数组中。这样做的目的是为了让API能够更友好地处理来自不同库(如jQuery)的post请求,无论其默认的Content-Type是application/x-www-form-urlencoded还是application/json。
解决方法是在AngularJS中发送post请求时,需要在请求头中明确设置Content-Type为application/json,以确保API能够正确解析post数据。
以下是解决方法的具体代码示例:
$http({ method: 'POST', url: 'your-api-url', headers: {'Content-Type': 'application/json'}, data: JSON.stringify(yourData) }).then(function(response) { // 请求成功的处理逻辑 }, function(error) { // 请求失败的处理逻辑 });
通过在请求头中设置Content-Type为application/json,并使用JSON.stringify方法将post数据转为json字符串,可以确保API能够正确解析post数据,并且能够正常处理请求。
希望这能对你有所帮助。
AngularJS HTTP post到PHP的问题出现的原因是,PHP默认情况下无法直接从请求中获取JSON数据。通常,PHP会将POST请求的数据解析为关联数组并存储在$_POST超全局变量中。但是,当使用AngularJS的$http服务发送POST请求时,数据被以JSON格式发送,而不是以url-encoded的形式发送。因此,$_POST变量为空,导致数据无法正确解析。
为了解决这个问题,可以在服务器端的初始化文件中添加以下代码段:
if ($_SERVER['REQUEST_METHOD'] == 'POST' && empty($_POST)) $_POST = json_decode(file_get_contents('php://input'), true);
这段代码的作用是将从请求中获取的JSON数据解析为关联数组,并存储在$_POST变量中。为了避免$_POST变量为空的情况,还可以将结果强制转换为数组:
$_POST = (array) json_decode(file_get_contents('php://input'), true);
关于为什么PHP没有默认实现这个功能,以及为什么期望PHP做出预期行为是错误的,这些问题没有得到明确的解释。然而,这种解决方法可能是一种比较脆弱的方法,因为只适用于POST数据表示关联数组的情况。如果POST数据表示的是数值索引数组,那么$_POST变量将得到一个数值索引的数组,这在其他依赖于一致的$_POST超全局变量行为的系统部分中可能会导致意外行为。
需要注意的是,这种解决方法仅适用于使用AngularJS发送POST请求的应用程序,并且必须对POST数据进行严格的验证,以避免安全问题。
AngularJS HTTP post to PHP and undefined问题的出现原因是,AngularJS的.post()
方法默认将Content-type头设置为application/json
。但是,你覆盖了这个设置,将其改为传递表单编码的数据。然而,你没有改变data
的值以传递适当的查询字符串,所以PHP无法像你期望的那样填充$_POST
。
解决这个问题的方法有两种:
1. 使用默认的AngularJS设置,将头部的Content-type设置为application/json
,然后在PHP中读取原始输入,并对JSON进行反序列化。在PHP中可以这样实现:
$postdata = file_get_contents("php://input"); $request = json_decode($postdata); $email = $request->email; $pass = $request->password;
2. 如果你非常依赖于$_POST
功能,你可以构建一个查询字符串(如email=someemail.com&password=somepassword
)并将其作为数据发送。确保这个查询字符串进行了URL编码。如果是手动构建的(而不是使用像jQuery.serialize()
这样的方法),可以使用JavaScript的encodeURIComponent()
方法来进行URL编码。
这个问题的解决方法取决于你的需求和应用架构。如果你与一个消费/传递JSON的REST服务进行交互,那么最好使用JSON的Content-type。如果你主要使用的是可以产生HTML或HTML片段的端点,或者使用基本的表单提交作为AJAX的后备,那么最好使用表单编码。