摘要:核心代碼在類中我們會定義幾個的數組,通過來進行判斷處理,針對性的進行數據獲取和轉換。
PHP中的$_POST和file_get_content("php://input")
$_POST故事背景:又是一個激情四射的故事。前段時間我們在弄我們自己的開源基礎組件,基礎組件包括我們經常使用的一些組件,比如說aliyunMQ,aliyunSearch、request(基于guzzle)等進行封裝處理。就是這個request引發了一些美好的誤會。
老規矩,查看官方文檔,全世界都會騙你,但是文檔不會騙你。
$HTTP_POST_VARS [已棄用] $_POST -- $HTTP_POST_VARS [已棄用] — HTTP POST 變量 當 HTTP POST 請求的 Content-Type 是 application/x-www-form-urlencoded 或 multipart/form-data 時,會將變量以關聯數組形式傳入當前腳本。 $HTTP_POST_VARS 包含相同的信息,但它不是一個超全局變量。 (注意 $HTTP_POST_VARS 和 $_POST 是不同的變量,PHP 處理它們的方式不同)
一看文檔就知道全部信息了,$_POST支持的request中的header中的content-type的類型只有application/x-www-form-urlencoded 或 multipart/form-data 。
當我們使用guzzle的時候它會根據你傳入的params是否是數組進行判斷,如果不是數組會在body中。但是如果是數組它就會按照json方式進行傳遞,content-type會application/json的方式當然不會被$_POST進行處理。所以,這邊是沒有毛病的。但是,難道因為用了這個組件就不進行這個類型處理了嗎?顯然不行。
php://inputphp:// — 訪問各個輸入/輸出流(I/O streams) PHP 提供了一些雜項輸入/輸出(IO)流,允許訪問 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 是無效的。 Note: 在 PHP 5.6 之前 php://input 打開的數據流只能讀取一次; 數據流不支持 seek 操作。 不過,依賴于 SAPI 的實現,請求體數據被保存的時候, 它可以打開另一個 php://input 數據流并重新讀取。 通常情況下,這種情況只是針對 POST 請求,而不是其他請求方式,比如 PUT 或者 PROPFIND。
這個東西說實話,就是$_POST基于這個進行封裝處理了一層。它能夠獲取到最原始的數據,不管你是什么content-type,它都能夠獲取到數據。所以,當我們的post的過來的數據是原始數據的時候,比如說是application/json或者" application/x-json,text/xml, application/xml,application/x-xml這些時候,$_POST都是無法獲取到數據的。此刻,我們就需要通過php://input進行獲取原始數據了。但是,原始數據并不是我們想要的最終格式。因此,我們需要進行封裝一層。
parseRequestrequest類其實是很好寫的,但是一般的類中對post方式傳遞參數還是老方式。因此,我改寫了一般的類中獲取post的參數,對于所有post請求方式的方法,針對不同的content-type進行數據獲取和原始數據的解析,弄成我們想要的最終數組。
核心代碼:
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數組,通過$_SERVER["CONTENT_TYPE"]來進行判斷處理,針對性的進行數據獲取和轉換。
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格式的數據,同時封裝了數據處理類
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格式數據轉換成array數據。
后話一般$_POST在很多項目中會有使用,基本上用來使用獲取參數數據。通常的請求的content-type不會出現很奇怪的,但是我覺得還是需要自己去封裝一層進行數據獲取的類,能夠省去很多麻煩,或者說對于你們項目的一致性有很多幫助。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/25715.html
摘要:遇到個和在獲取客戶端方式不同導致跨系統的問題。編碼擴展討論與的區別是什么手冊上的解釋是返回字符串,此字符串中除了之外的所有非字母數字字符都將被替換成百分號后跟兩位十六進制數,空格則編碼為加號。 遇到個 Java 和 Php 在獲取客戶端 cookie 方式不同導致跨系統的問題。所以寫了這篇博客梳理下相關知識。 實驗 下面通過兩個簡單的實驗,來看Java和Php在獲取web請求中的coo...
摘要:在中的應用官網源碼解讀號外號外歡迎大家我們開發組定了一個就線下聚一次的小目標上一篇源碼解讀反響還不錯不少同學推薦再加一篇講解一下中使用到的功能幫助大家開啟的實戰之旅服務器開發涉及到的相關技術領域的知識非常多不日積月累打好基礎是很難真正 date: 2017-12-14 21:34:51title: swoole 在 swoft 中的應用 swoft 官網: https://www.sw...
摘要:因為在無法識別的時候,就會把數據填入到中。需要設置中的值為才會生效當與可以取到值時為空不能用于中已經移除了這個全局變量,用替代可通過輸入流以文件讀取方式取得未經處理的原始數據,允許讀取的原始數據。和比起來,它給內存帶來的壓力較小。 $POST $_POST是我們最常用的獲取POST數據的方式,它是以關聯數組方式組織提交的數據,并對此進行編碼處理,如urldecode,甚至編碼轉換,識別...
摘要:微信小程序開發官方文檔,正在開發的小程序的源碼,都給了我不少啟發到小程序上富文本的解析一個優秀的開源項目微信小程序富文本解析組件作用在于解析你論壇上的帖子內容,你論壇上加粗的文字,加了顏色的文字,圖片等等,都可以原原本本的展示在小程序中。 關于這個小程序 Github : https://github.com/DowneyL/di...‘ 這個小程序是公司針對一個自家產品的需求,而這個...
閱讀 3278·2023-04-26 00:57
閱讀 600·2021-10-08 10:05
閱讀 1345·2021-09-08 09:36
閱讀 4147·2021-08-12 13:31
閱讀 2542·2019-08-30 15:55
閱讀 2237·2019-08-30 15:55
閱讀 1013·2019-08-30 15:55
閱讀 2684·2019-08-29 13:17