By:0x584A Date:2016年05月19日11-09-33
前言
近期一直在寫接口,最后總結成一句話:接口寫的好,回家回的早。接口寫的爛,凌晨兩點半。
好了,我要說的話說完了~((#‵′)凸 怎么可能~),所以呢,稍微做個小總結吧!
以前接口寫的少,如果Ajax異步調用數據也算寫接口的話~
首先,用戶接收數據的時候走的是json格式數據,也就使用php://input來接收POST流數據。隨后將接收的到的json數據轉換成array格式,進行數據校驗后進行具體的業務代碼運行。最終返回一個json或xml格式數據,供用戶讀取接收。
- php://input與post-form的區別
先讓我們來看看他們發送的http請求體數據:
發送格式:Content-Type:application/json
POST HTTP/1.1
Host: test.com
Content-Type: application/json
Cache-Control: no-cache
{"name":"xjiek"}
發送格式:Content-Type: multipart/form-data
POST HTTP/1.1
Host: test.com
Content-Type: multipart/form-data
Cache-Control: no-cache
name=xjiek
前者在結構體中使用的是json格式,后者則是常規的鍵值對(我們常規的表單的post傳參方式,均使用的是該模式)。
在獲取json數據時,腳本使用如下語句即可:
# 將流數據先用json函數處理成數數組,判斷其值是否存在,存在則賦值給超全局變量$_POST
if ($postData = json_decode(file_get_contents("php://input"), true)) {
$_POST = $postData;
}
PHP的輸入輸出流是通過php://來訪問的,它允許訪問PHP的輸入輸出流/標準輸入輸出和錯誤描述符/ 內存中、磁盤備份的臨時文件流以及可以操作其他讀取寫入文件資源的過濾器。
php://input 允許讀取POST的原始流。
php://input 不能用于
enctype="multipart/form-data"
。
PHP默認識別的application/x-www.form-urlencoded
標準的數據類型,那么對于不識別的類型保留原型,交給$GLOBALS['HTTP_RAW_POST_DATA'] 來接收。
僅當Content-Type為application/x-www-form-urlencoded或multipart/form-data時,PHP才會將http請求數據包中的body相應部分數據填入$_POST全 局變量中,其它情況PHP都忽略。
僅當Content-Type為application/x-www-form-urlencoded且提交方法是POST方法時,$_POST與php://input數據才是一致的。一致值的是:它們格式不一致,內容一致
。
php://input 和 $HTTP_RAW_POST_DATA 比起來,它給內存帶來的壓力較小,并且不需要任何特殊的 php.ini 設置。
- 那么$HTTP_RAW_POST_DATA是什么呢?
$HTTP_RAW_POST_DATA是PHP內置的一個全局變量。它用于,PHP在無法識別的 Content-Type的情況下,將POST過來的數據原樣地填入變量$HTTP_RAW_POST_DATA。它同樣無法讀取Content- Type為multipart/form-data的POST數據。需要設置php.ini中的 always_populate_raw_post_data值為On,PHP才會總把POST數據填入變量$HTTP_RAW_POST_DATA。
還有就是,php://input 與$HTTP_RAW_POST_DATA讀取的數據是一樣的,都只讀取Content-Type不為multipart/form-data的數據。
**但是php://input比$HTTP_RAW_POST_DATA更湊效,且不需要特殊設置php.ini **
造了嘛?(⊙_⊙)?