我从 PHP 文件中得到 200 OK 响应,但是,返回的数据是这样说的email并且password是未定义的。这是我所有的 php

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

知道为什么我得到未定义的POST值吗?

编辑

我想指出,因为这似乎是一个受欢迎的问题(但它已经过时.success并且.error已被弃用,您应该.then像@James Gentes 在评论中指出的那样使用

6个回答

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()应该为您解决问题。

@ItsmeJulian 没有绝对正确的答案。这可能真的取决于您的应用程序的架构方式。如果您正在与使用/提供 JSON 的 REST 服务进行交互,那么我可能会坚持使用 JSON 内容类型。如果我主要使用可以生成 HTML 或 HTML 片段的端点或使用基本表单发布作为 AJAX 的后备,那么我可能倾向于坚持使用表单编码。
2021-03-10 18:58:21
@lepe 我不清楚链接的问题/答案与我的答案有何关联。这里没有讨论需要序列化一个 javascript 对象。
2021-03-17 18:58:21
@lascort 确实与解决方案没有太大区别。在我的解决方案中,我没有将数据填充到 $_POST 中,而是更喜欢用户定义的变量。一般来说,这对我来说更有意义,因为在处理 JSON 序列化数据时,您可能正在处理对象或数字索引数组。我不建议将数字索引数组添加到 $_POST,因为这将是一种非典型用途。我通常也避免将数据放入任何用于输入数据的超全局变量中。
2021-03-24 18:58:21
@Ronnie 这不是黑客攻击。这实际上取决于您希望如何设置 Web 服务。如果您想发送和检索 JSON,您需要使用原始输入,因为它$_POST不会被填充。
2021-04-01 18:58:21
不是不尊重你的知识,但使用file_get_contents("php://input");似乎有点像黑客,不是吗?我从来没有听说过这个。需要发生什么,所以我可以参考它$_POST['email'];
2021-04-03 18:58:21

我在服务器端做这件事,在我的 init 文件的开头,就像一个魅力,你不必在 angular 或现有的 php 代码中做任何事情:

if ($_SERVER['REQUEST_METHOD'] == 'POST' && empty($_POST))
    $_POST = json_decode(file_get_contents('php://input'), true);
我真的不明白为什么 PHP 人没有自己实现这个,他们真的希望总是 url 编码的帖子?
2021-03-10 18:58:21
如果 $_POST 为空,您应该投射您的结果:$_POST = (array) json_decode(file_get_contents('php://input'), true)
2021-03-12 18:58:21
当然,我只在有角度的应用程序中使用它,并且我非常彻底地验证了我的 POST 数据,不知道这怎么会是一个问题......
2021-03-17 18:58:21
这似乎是一种非常脆弱的方法,除非您完全知道 POSTed 数据表示一个关联数组(JSON 中的对象表示)。如果 JSON 包含数字索引的数组表示怎么办? $_POST在这种情况下,最终会得到一个数字索引的数组,这在依赖于一致的$_POST超全局行为的系统其他部分中将是非常意外的行为。
2021-03-30 18:58:21
@Bludream 我不明白为什么有人希望 PHP 做预期的事情。它始终违反了最小惊喜原则。
2021-04-02 18:58:21

在我正在开发的 API 中,我有一个基本控制器,在它的 __construct() 方法中,我有以下内容:

if(isset($_SERVER["CONTENT_TYPE"]) && strpos($_SERVER["CONTENT_TYPE"], "application/json") !== false) {
    $_POST = array_merge($_POST, (array) json_decode(trim(file_get_contents('php://input')), true));
}

这允许我在需要时简单地将 json 数据引用为 $_POST["var"]。效果很好。

这样,如果经过身份验证的用户连接到一个库,例如 jQuery,它发送默认为 Content-Type: application/x-www-form-urlencoded 或 Content-Type: application/json 的发布数据,API 将无错误地响应,并将使 API 对开发人员更加友好。

希望这可以帮助。

因为 PHP 本身并不接受 JSON'application/json'一种方法是从 angular 更新您的标头和参数,以便您的 api 可以直接使用数据。

首先,参数化你的数据:

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

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

?>

由于角度行为,在 PHP 服务器上没有针对正常发布行为的直接方法,因此您必须在 json 对象中对其进行管理。

这是不正确的。请参阅上面的答案,其中 JSON 是直接从 PHP 原始输入读取的。这比将 JSON 混合到查询字符串中要简单得多。
2021-03-30 18:58:21
.success.error方法已过时,从AngularJS框架已被删除。
2021-03-31 18:58:21
其它你可能感兴趣的问题
上一篇有没有办法在 JavaScript 的函数调用中提供命名参数? 下一篇JavaScript 查询字符串