在使用xml-rpc的時候,server端擷取client資料,主要是通過php輸入流input,而不是$_POST數組。是以,這裡主要探讨php輸入流php://input
對一php://input介紹,PHP官方手冊文檔有一段話對它進行了很明确地概述。
“php://input allows you to read raw POST data. It is a less memory intensive alternative to $HTTP_RAW_POST_DATA and does not need any special php.ini directives. php://input is not available with enctype=”multipart/form-data”.
翻譯過來,是這樣:
“php://input可以讀取沒有處理過的POST資料。相較于$HTTP_RAW_POST_DATA而言,它給記憶體帶來的壓力較小,并且不需要特殊的php.ini設定。php://input不能用于enctype=multipart/form-data”
我們應該怎麼去了解這段概述呢?!我把它劃分為三部分,逐漸去了解。
讀取POST資料
不能用于multipart/form-data類型
php://input VS $HTTP_RAW_POST_DATA
PHPer 們一定很熟悉$_POST這個内置變量。$_POST與 php://input存在哪些關聯與差別呢?另外,用戶端向服務端互動資料,最常用的方法除了POST之外,還有GET。既然php://input作 為PHP輸入流,它能讀取GET資料嗎?這二個問題正是我們這節需要探讨的主要内容。
經驗告訴我們,從測試與觀察中總結,會是一個很湊效的方法。這裡,我寫了幾個腳本來幫助我們測試。
@file 192.168.0.6:/phpinput_server.php 列印出接收到的資料
@file 192.168.0.8:/phpinput_post.php 模拟以POST方法送出表單資料
@file 192.168.0.8:/phpinput_xmlrpc.php 模拟以POST方法發出xmlrpc請求.
@file 192.168.0.8:/phpinput_get.php 模拟以GET方法送出表單表數
phpinput_server.php與phpinput_post.php
我們可以通過使用工具ngrep抓取http請求包(因為我們需要探知的是php://input,是以我們這裡隻抓取http Request資料包)。我們來執行測試腳本phpinput_post.php
通過ngrep抓到的http請求包如下:
仔細觀察,我們不難發現
1,$_POST資料,php://input 資料與httpd entity body資料是“一緻”的
2,http請求中的Content-Type是application/x-www-form-urlencoded ,它表示http請求body中的資料是使用http的post方法送出的表單資料,并且進行了urlencode()處理。
(注:注意加粗部分内容,下文不再提示).