摘要:核心代碼在類中我們會定義幾個的數(shù)組,通過來進行判斷處理,針對性的進行數(shù)據(jù)獲取和轉(zhuǎn)換。
PHP中的$_POST和file_get_content("php://input")
$_POST故事背景:又是一個激情四射的故事。前段時間我們在弄我們自己的開源基礎(chǔ)組件,基礎(chǔ)組件包括我們經(jīng)常使用的一些組件,比如說aliyunMQ,aliyunSearch、request(基于guzzle)等進行封裝處理。就是這個request引發(fā)了一些美好的誤會。
老規(guī)矩,查看官方文檔,全世界都會騙你,但是文檔不會騙你。
$HTTP_POST_VARS [已棄用] $_POST -- $HTTP_POST_VARS [已棄用] — HTTP POST 變量 當 HTTP POST 請求的 Content-Type 是 application/x-www-form-urlencoded 或 multipart/form-data 時,會將變量以關(guān)聯(lián)數(shù)組形式傳入當前腳本。 $HTTP_POST_VARS 包含相同的信息,但它不是一個超全局變量。 (注意 $HTTP_POST_VARS 和 $_POST 是不同的變量,PHP 處理它們的方式不同)
一看文檔就知道全部信息了,$_POST支持的request中的header中的content-type的類型只有application/x-www-form-urlencoded 或 multipart/form-data 。
當我們使用guzzle的時候它會根據(jù)你傳入的params是否是數(shù)組進行判斷,如果不是數(shù)組會在body中。但是如果是數(shù)組它就會按照json方式進行傳遞,content-type會application/json的方式當然不會被$_POST進行處理。所以,這邊是沒有毛病的。但是,難道因為用了這個組件就不進行這個類型處理了嗎?顯然不行。
php://inputphp:// — 訪問各個輸入/輸出流(I/O streams) PHP 提供了一些雜項輸入/輸出(IO)流,允許訪問 PHP 的輸入輸出流、標準輸入輸出和錯誤描述符, 內(nèi)存中、磁盤備份的臨時文件流以及可以操作其他讀取寫入文件資源的過濾器。 php://input 是個可以訪問請求的原始數(shù)據(jù)的只讀流。 POST 請求的情況下,最好使用 php://input 來代替 $HTTP_RAW_POST_DATA,因為它不依賴于特定的 php.ini 指令。 而且,這樣的情況下 $HTTP_RAW_POST_DATA 默認沒有填充, 比激活 always_populate_raw_post_data 潛在需要更少的內(nèi)存。 enctype="multipart/form-data" 的時候 php://input 是無效的。 Note: 在 PHP 5.6 之前 php://input 打開的數(shù)據(jù)流只能讀取一次; 數(shù)據(jù)流不支持 seek 操作。 不過,依賴于 SAPI 的實現(xiàn),請求體數(shù)據(jù)被保存的時候, 它可以打開另一個 php://input 數(shù)據(jù)流并重新讀取。 通常情況下,這種情況只是針對 POST 請求,而不是其他請求方式,比如 PUT 或者 PROPFIND。
這個東西說實話,就是$_POST基于這個進行封裝處理了一層。它能夠獲取到最原始的數(shù)據(jù),不管你是什么content-type,它都能夠獲取到數(shù)據(jù)。所以,當我們的post的過來的數(shù)據(jù)是原始數(shù)據(jù)的時候,比如說是application/json或者" application/x-json,text/xml, application/xml,application/x-xml這些時候,$_POST都是無法獲取到數(shù)據(jù)的。此刻,我們就需要通過php://input進行獲取原始數(shù)據(jù)了。但是,原始數(shù)據(jù)并不是我們想要的最終格式。因此,我們需要進行封裝一層。
parseRequestrequest類其實是很好寫的,但是一般的類中對post方式傳遞參數(shù)還是老方式。因此,我改寫了一般的類中獲取post的參數(shù),對于所有post請求方式的方法,針對不同的content-type進行數(shù)據(jù)獲取和原始數(shù)據(jù)的解析,弄成我們想要的最終數(shù)組。
核心代碼:
public static function post($key = NULL, $default = NULL) { $data = []; if(in_array($_SERVER["CONTENT_TYPE"],self::$formats["json"])){ $data = file_get_contents("php://input"); $data = json_decode($data,true); } if(in_array($_SERVER["CONTENT_TYPE"],self::$formats["xml"])){ $data = file_get_contents("php://input"); $data = DataParser::toArray($data); } if($key==null && !empty($data)){ return $data; } if(!empty($data)){ return isset($data[$key]) ? $data[$key] : $default; } return static::lookup($_POST, $key, $default); }
在類中我們會定義幾個conten-type的format數(shù)組,通過$_SERVER["CONTENT_TYPE"]來進行判斷處理,針對性的進行數(shù)據(jù)獲取和轉(zhuǎn)換。
protected static $formats = array( "html" => array("text/html", "application/xhtml+xml"), "txt" => array("text/plain"), "js" => array("application/javascript", "application/x-javascript", "text/javascript"), "css" => array("text/css"), "json" => array("application/json", "application/x-json"), "xml" => array("text/xml", "application/xml", "application/x-xml"), "rdf" => array("application/rdf+xml"), "atom" => array("application/atom+xml"), "rss" => array("application/rss+xml"), );
針對xml格式的數(shù)據(jù),同時封裝了數(shù)據(jù)處理類
public static function toArray($xml) { if (!$xml) { return false; } // 檢查xml是否合法 $xml_parser = xml_parser_create(); if (!xml_parse($xml_parser, $xml, true)) { xml_parser_free($xml_parser); return false; } libxml_disable_entity_loader(true); $data = json_decode(json_encode(simplexml_load_string($xml, "SimpleXMLElement", LIBXML_NOCDATA)), true); return $data; }
就是簡單的將xml格式數(shù)據(jù)轉(zhuǎn)換成array數(shù)據(jù)。
后話一般$_POST在很多項目中會有使用,基本上用來使用獲取參數(shù)數(shù)據(jù)。通常的請求的content-type不會出現(xiàn)很奇怪的,但是我覺得還是需要自己去封裝一層進行數(shù)據(jù)獲取的類,能夠省去很多麻煩,或者說對于你們項目的一致性有很多幫助。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/25715.html
摘要:遇到個和在獲取客戶端方式不同導(dǎo)致跨系統(tǒng)的問題。編碼擴展討論與的區(qū)別是什么手冊上的解釋是返回字符串,此字符串中除了之外的所有非字母數(shù)字字符都將被替換成百分號后跟兩位十六進制數(shù),空格則編碼為加號。 遇到個 Java 和 Php 在獲取客戶端 cookie 方式不同導(dǎo)致跨系統(tǒng)的問題。所以寫了這篇博客梳理下相關(guān)知識。 實驗 下面通過兩個簡單的實驗,來看Java和Php在獲取web請求中的coo...
摘要:在中的應(yīng)用官網(wǎng)源碼解讀號外號外歡迎大家我們開發(fā)組定了一個就線下聚一次的小目標上一篇源碼解讀反響還不錯不少同學推薦再加一篇講解一下中使用到的功能幫助大家開啟的實戰(zhàn)之旅服務(wù)器開發(fā)涉及到的相關(guān)技術(shù)領(lǐng)域的知識非常多不日積月累打好基礎(chǔ)是很難真正 date: 2017-12-14 21:34:51title: swoole 在 swoft 中的應(yīng)用 swoft 官網(wǎng): https://www.sw...
摘要:因為在無法識別的時候,就會把數(shù)據(jù)填入到中。需要設(shè)置中的值為才會生效當與可以取到值時為空不能用于中已經(jīng)移除了這個全局變量,用替代可通過輸入流以文件讀取方式取得未經(jīng)處理的原始數(shù)據(jù),允許讀取的原始數(shù)據(jù)。和比起來,它給內(nèi)存帶來的壓力較小。 $POST $_POST是我們最常用的獲取POST數(shù)據(jù)的方式,它是以關(guān)聯(lián)數(shù)組方式組織提交的數(shù)據(jù),并對此進行編碼處理,如urldecode,甚至編碼轉(zhuǎn)換,識別...
摘要:微信小程序開發(fā)官方文檔,正在開發(fā)的小程序的源碼,都給了我不少啟發(fā)到小程序上富文本的解析一個優(yōu)秀的開源項目微信小程序富文本解析組件作用在于解析你論壇上的帖子內(nèi)容,你論壇上加粗的文字,加了顏色的文字,圖片等等,都可以原原本本的展示在小程序中。 關(guān)于這個小程序 Github : https://github.com/DowneyL/di...‘ 這個小程序是公司針對一個自家產(chǎn)品的需求,而這個...
閱讀 3300·2023-04-26 00:57
閱讀 616·2021-10-08 10:05
閱讀 1357·2021-09-08 09:36
閱讀 4178·2021-08-12 13:31
閱讀 2555·2019-08-30 15:55
閱讀 2248·2019-08-30 15:55
閱讀 1025·2019-08-30 15:55
閱讀 2694·2019-08-29 13:17