近期API接口開發小記(關于php://input)

By:0x584A Date:2016年05月19日11-09-33

前言

近期一直在寫接口,最后總結成一句話:接口寫的好,回家回的早。接口寫的爛,凌晨兩點半。

好了,我要說的話說完了~((#‵′)凸 怎么可能~),所以呢,稍微做個小總結吧!


以前接口寫的少,如果Ajax異步調用數據也算寫接口的話~

首先,用戶接收數據的時候走的是json格式數據,也就使用php://input來接收POST流數據。隨后將接收的到的json數據轉換成array格式,進行數據校驗后進行具體的業務代碼運行。最終返回一個json或xml格式數據,供用戶讀取接收。

先讓我們來看看他們發送的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 **

造了嘛?(⊙_⊙)?

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容