php未从请求获取数据,从curl发布

php未从请求获取数据,从curl发布,php,curl,Php,Curl,我正在从命令行触发一个curl请求 我的卷曲请求如下所示: curl -X POST -H "Accept: application/json" -H "Content-type: application/json" -d '{ "BookingByCustomer" : "testUser", "BookingDate" : "11111111", "TotalCost" : "11", "NetAmount" : "11" }' http://serverIP:port/test.ph

我正在从命令行触发一个curl请求

我的卷曲请求如下所示:

curl -X POST -H "Accept: application/json"  -H "Content-type: application/json"  -d '{ "BookingByCustomer" : "testUser", "BookingDate" : "11111111", "TotalCost" : "11", "NetAmount"  : "11" }' http://serverIP:port/test.php 
我的PHP代码:

    <?php
   /** global variables */
    $request_called = ($_SERVER['REQUEST_METHOD'] == 'GET') ? 'GET' : 'POST';

    if($request_called == 'POST')
    {
         handle_post_request();
    }
    if($request_called == 'GET')
     {
       handle_get_request();
     }

    function handle_get_request (){
      echo "Get Request has been called!";   
   }

    function handle_post_request (){
   $json = $_SERVER['HTTP_JSON'];
    print_r ($_SERVER);
   }
 ?>


但是$\u服务器似乎没有json数据。我遗漏了什么吗?

$\u服务器中没有
$\u服务器['HTTP\u JSON']
这样的条目。您需要从
$\u POST
获取帖子内容

但是,由于您没有为JSON数据提供变量名,因此应该使用

$json = file_get_contents("php://input");
另一个解决方案是为JSON数据分配一个变量名:

curl -X POST ... -d 'HTTP_JSON={ ... }'

只要JSON中没有禁止的字符(如?或&),您就是安全的,否则您还必须对JSON字符串进行URL编码。这就是为什么我建议使用
php://input
。这样,您就不必关心URL编码。

您使用curl发布信息,因此请使用
$\u POST
而不是
$\u SERVER

function handle_post_request (){
    $json = $_POST['HTTP_JSON'];
    print_r ($_POST);
}

此函数返回$_SERVER的值,而不是$json变量的值

  function handle_post_request (){
   $json = $_SERVER['HTTP_JSON'];
    print_r ($_SERVER);
   }
第二,我相信你必须使用$u POST来实现这一点:

  function handle_post_request (){
   $json = $_POST['HTTP_JSON'];
    print_r ($json, true);
   }

没有更多的代码很难说。您刚刚提供了一个函数的用法。它非常简单。。但我仍然把代码贴在这里,我注意到你们在服务器上寻找它。。。它不应该放在POST中吗?当你不认识请求方法时,你不应该假装收到了一个
POST
。相反,您应该返回405HTTP错误。也许你收到了一个
HEAD
请求……你能解释一下你的答案吗。因为根据我得到的定义——“file_get_contents()是将文件内容读入字符串的首选方式。”但我不发送任何文件。在php中,URL也被视为文件。这是一个特定于PHP的URL,包含请求的完整主体。您将在POST请求的正文中发送JSON,因此必须以这种方式获得它。我还将在一分钟内向您展示使用$\u POST数组执行此操作的另一种方法…还有一个疑问,如果我从andriod客户端发送数据,是否需要更改代码?或者它也会一样工作..这将适用于每个POST请求,无论它来自哪里,浏览器或命令行,手机或桌面…我尝试了,但得到了一个空白数组。。。任何关于为什么$u POST如此的建议都是正确的,但是由于JSON没有变量名,您必须获取原始POST数据$u POST是正确的,但是由于JSON没有变量名,您必须获取原始POST数据AHH。但是$json=$\u POST['HTTP\u json']是完全无用的?是的,因为请求没有HTTP\u json..所以是的,在将此名称赋予json数据之前它是无用的。。在第一种情况下,我正在打印$\u服务器变量,以便查看我的所有请求参数。啊,好的,谢谢!:-)(不,我不是世界上真正最好的程序员;-)但我正在学习:-)