天天看點

PHP擷取HTTP body内容的方法總結

有時候我們擷取資料時需要根據Header中的格式來解析,比如上傳一個json而不是一個文本。這裡用到了 php輸入|輸出流 的概念。

PHP 提供了一些雜項輸入/輸出(IO)流,允許通路 PHP 的輸入輸出流、标準輸入輸出和錯誤描述符, 記憶體中、磁盤備份的臨時檔案流以及可以操作其他讀取寫入檔案資源的過濾器。

本文涉及到了了,php://input,詳盡内容請參閱官網:點選檢視官網 (http://php.net/manual/zh/wrappers.php.php)

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 目标使用以下的參數作為它路徑的一部分。 複合過濾鍊能夠在一個路徑上指定。詳細使用這些參數可以參考具體範例。