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