當 Content-type 為 text/xml 等其他類型的資料,$_POST便無法取得。
若有接收其他類型 Content-type 的需求,可以使用 php://input,
php://input 可以讀取 request body 的資料,所以可以取得 HTTP POST 的資料,
但有一個限制,就是當 Content-type 為 multipart/form-data ,php://input 會取得空值,無法使用。
下面範例 php://input 搭配 file_get_contents 使用,和 $_POST 比較在 Content-type 分別為 multipart/form-data、application/x-www-form-urlencoded、text/xml 時,兩者接收資料的情況
接收資料的程式:
後面範例用來 request 的網址:http://127.0.0.1/test/test.php
1
2
3
|
$postdata
=
file_get_contents
(
"php://input"
,
'r'
);
var_dump(
$postdata
);
// php://input
var_dump(
$_POST
);
|
範例 1:(multipart/form-data )
使用 curl 模擬 HTTP POST,Content-type 為 multipart/form-data
(CURLOPT_POSTFIELDS 資料為陣列時,會以 multipart/form-data 方式傳送)
1
2
3
4
5
6
7
8
|
$ch
= curl_init();
$data
=
array
(
'aa'
=>
'123'
,
'bb'
=>
'456'
);
curl_setopt(
$ch
, CURLOPT_URL,
'http://127.0.0.1/test/test.php'
);
curl_setopt(
$ch
, CURLOPT_POST, 1);
curl_setopt(
$ch
, CURLOPT_POSTFIELDS,
$data
);
curl_setopt(
$ch
, CURLOPT_HEADER,0);
curl_exec(
$ch
);
curl_close(
$ch
);
|
$postdata:string(0) ""
$_POST (OK):array(2) { ["aa"]=> string(3) "123" ["bb"]=> string(3) "456" }
範例 2:(application/x-www-form-urlencoded )
使用 curl 模擬 HTTP POST,Content-type 為 application/x-www-form-urlencoded
1
2
3
4
5
6
7
8
9
|
$ch
= curl_init();
$data
=
'aa=123&bb=456'
;
curl_setopt(
$ch
, CURLOPT_URL,
'http://127.0.0.1/test/test.php'
);
curl_setopt(
$ch
, CURLOPT_HTTPHEADER,
array
(
"Content-type: application/x-www-form-urlencoded"
));
curl_setopt(
$ch
, CURLOPT_POST, 1);
curl_setopt(
$ch
, CURLOPT_POSTFIELDS,
$data
);
curl_setopt(
$ch
, CURLOPT_HEADER,0);
curl_exec(
$ch
);
curl_close(
$ch
);
|
$postdata (OK):string(13) "aa=123&bb=456"
$_POST (OK):array(2) { ["aa"]=> string(3) "123" ["bb"]=> string(3) "456" }
範例 3:(text/xml )
使用 curl 模擬 HTTP POST,Content-type 為 text/xml
1
2
3
4
5
6
7
8
9
|
$ch
= curl_init();
$data
=
'<?xml version="1.0" encoding="utf-8"?><root><aa>123</aa><bb>456</bb></root>'
;
curl_setopt(
$ch
, CURLOPT_URL,
'http://127.0.0.1/test/test.php'
);
curl_setopt(
$ch
, CURLOPT_HTTPHEADER,
array
(
"Content-type: text/xml;charset=\"utf-8\""
));
curl_setopt(
$ch
, CURLOPT_POST, 1);
curl_setopt(
$ch
, CURLOPT_POSTFIELDS,
$data
);
curl_setopt(
$ch
, CURLOPT_HEADER,0);
curl_exec(
$ch
);
curl_close(
$ch
);
|
$postdata (OK):string(36) "<?xml version="1.0" encoding="utf-8"?><root><aa>123</aa><bb>456</bb></root>"
$_POST:array(0) {}
結論:
所以如果有一 PHP 程式,用來接收其它地方 POST 過來的資料,例如是 XML 的資料,應該就可以利用 file_get_contents("php://input",'r') 來取得 POST 過來的內容。