2013-03-26 267 views
1

我正在從命令行發起curl請求。php沒有從請求中獲取數據,從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); 
    } 
?> 

但$ _ SERVER似乎並不具有JSON數據。我錯過了什麼??

+0

很難說沒有更多的代碼。你只是提供了一個功能使用。 – bestprogrammerintheworld 2013-03-26 23:52:01

+0

其faiirly簡單的PHP ..但我仍然在這裏發佈代碼 – umesh 2013-03-26 23:53:14

+0

我注意到你在SERVER找它...不應該在POST? – 2013-03-26 23:55:31

回答

3

有沒有這樣的條目$_SERVER['HTTP_JSON']$_SERVER。您需要從$_POST獲取POST內容。

但是當你不給你的JSON數據的變量名,你應該得到的原始帖子內容與

$json = file_get_contents("php://input"); 

另一種解決方案是一個變量名給JSON數據:

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

只要您在JSON中沒有禁用的字符(如?或&),您就可以安全使用,否則您還必須對您的JSON字符串進行URL編碼。這就是爲什麼我建議使用php://input的第一個解決方案。這樣你就不必關心URL編碼。

+0

你可以請你解釋一下你的答案。根據定義,我得到了 - 「file_get_contents()是將文件內容讀入字符串的首選方法。」但我沒有發送任何文件。 – umesh 2013-03-26 23:59:14

+0

在PHP中,URL也被視爲文件。這是一個PHP特定的URL,它包含了請求的完整主體。您在POST請求的正文中發送您的JSON,因此您必須以此方式獲取它。我還會告訴你另一種方法,在一分鐘內使用$ _POST數組... – Dehalion 2013-03-27 00:02:13

+0

酷哥!謝謝..它的作品!我還在等另一種方法.. – umesh 2013-03-27 00:04:01

0

您正在用curl發佈信息,所以請使用$_POST而不是$_SERVER

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

我試過了,但有一個空白的數組......任何建議爲什麼它是如此 – umesh 2013-03-27 00:01:16

+0

$ _POST是正確的,但由於JSON沒有變量名稱,你必須得到原始POST數據 – Dehalion 2013-03-27 00:13:02

0

該函數返回$ _SERVER的值而不是$ json-variable的值。

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

其次我認爲你必須使用$ _POST得到這個工作:

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

$ _POST是正確的,但由於JSON沒有變量名稱,你必須得到原始POST數據 – Dehalion 2013-03-27 00:16:38

+0

ahh。但是,然後$ json = $ _POST ['HTTP_JSON']是完全沒用的? – bestprogrammerintheworld 2013-03-27 00:25:12

+0

是因爲請求沒有HTTP_JSON ..所以它是沒用的,直到這個名字給予Json數據..我在第一種情況下打印$ _SERVER變量,以便我可以看到我的所有請求參數。 – umesh 2013-03-27 00:31:47