PHP 獲取Http body的內容
有時候我們獲取數據時需要根據Header中的格式來解析,比如上傳一個json而不是一個文本。這裏用到了 php輸入|輸出流 的概念。
PHP 提供了一些雜項輸入/輸出(IO)流,允許訪問 PHP 的輸入輸出流、標準輸入輸出和錯誤描述符, 內存中、磁盤備份的臨時文件流以及可以操作其他讀取寫入文件資源的過濾器。
本文涉及到了了,php://input,詳盡內容請參閱官網:點擊查看官網
php://input 是個可以訪問請求的原始數據的只讀流。 POST 請求的情況下,最好使用 php://input
來代替 $HTTP_RAW_POST_DATA
,因爲它不依賴於特定的 php.ini 指令。 而且,這樣的情況下 $HTTP_RAW_POST_DATA 默認沒有填充, 比激活 always_populate_raw_post_data
潛在需要更少的內存。 enctype="multipart/form-data"
的時候 php://input
是無效的。
模擬代碼
// server.php
switch($_SERVER['CONTENT_TYPE']){
case 'application/json':
// 這裏通過輸入端來獲取數據
$body = file_get_contents('php://input');
echo '這是一個json:', $body;
break;
// ...
}
// client_web.php, 注意這裏使用了 axios
// ...
service = axios.create({
baseURL: 'mydomain',
validateStatus:function(status){
if(500 >= status) alert('server fails');
}
});
// 發一個請求
service.post(url, {
// ...
headers: {'Content-Type':'application/json'},
data:'{"code":100}'
// ...
});
// 全局設置也沒問題
service.interceptors.request.use(function(config){
// 這裏設置請求頭
config.headers['Content-Type'] = 'application/json';
return config;
}, function(err){});
引申閱讀
以下爲官方文檔小抄
PHP 輸入|輸出流分爲: php://stdin, php://stdout 和 php://stderr
php://stdin
、php://stdout
和php://stderr
允許直接訪問 PHP 進程相應的輸入或者輸出流。 數據流引用了複製的文件描述符,所以如果你打開php://stdin
並在之後關了它, 僅是關閉了複製品,真正被引用的 STDIN 並不受影響。 注意 PHP 在這方面的行爲有很多 BUG 直到 PHP 5.2.1。 推薦你簡單使用常量 STDIN、 STDOUT 和 STDERR 來代替手工打開這些封裝器。
其中php://stdin
是隻讀的,php://stdout
和php://stderr
是隻寫的。
php://output
php://output
是一個只寫的數據流, 允許你以 print 和 echo 一樣的方式 寫入到輸出緩衝區。
php://fd
php://fd
允許直接訪問指定的文件描述符。 例如 php://fd/3 引用了文件描述符 3。
php://memory 和 php://temp
php://memory
和 php://temp
是一個類似文件 包裝器的數據流,允許讀寫臨時數據。 兩者的唯一區別是 php://memory
總是把數據儲存在內存中, 而 php://temp
會在內存量達到預定義的限制後(默認是 2MB)存入臨時文件中。 臨時文件位置的決定和 sys_get_temp_dir()
的方式一致。
php://temp 的內存限制可通過添加 /maxmemory:NN 來控制,NN 是以字節爲單位、保留在內存的最大數據量,超過則使用臨時文件。
php://filter
php://filter
是一種元封裝器, 設計用於數據流打開時的篩選過濾應用。 這對於一體式(all-in-one)的文件函數非常有用,類似 readfile()
、 file()
和 file_get_contents()
, 在數據流內容讀取之前沒有機會應用其他過濾器。
php://filter
目標使用以下的參數作爲它路徑的一部分。 複合過濾鏈能夠在一個路徑上指定。詳細使用這些參數可以參考具體範例。