HTTP協議
目錄
HTTP協議概念
HTTP協議即超文本傳輸協議(Hypertext Transfer Protocol)。是一種詳細規定了了瀏覽器與萬維網服務器之間互相通信的規則。
HTTP協議特點
1)客戶/服務器模式
2)簡單快速:客戶向服務器請求服務時,只需傳送請求方法和路徑。
3)靈活:HTTP協議允許傳輸任意類型的數據對象
4)無連接:無連接的含義是限制每次連接只處理一個請求。
5)無狀態:HTTP協議是無狀態協議。無狀態是指對於事務處理沒有記憶能力。缺少狀態意味着如果後續處理需要前面的信息,則它必須重傳。另一方面,在服務器不需要先前信息時它的應答就比較快。
HTTP協議分類
HTTP請求協議:瀏覽器向服務器發起請求的時候需要遵循的協議
HTTP響應協議:服務器向瀏覽器發起響應的時候需要遵循的協議。
HTTP請求
請求行
1)形式:請求方式 資源路徑 協議版本號
2)GET/index.php HTTP/1.1
最早的時候HTTP協議有過1.0,請求行獨佔一行(第一行)
請求頭
請求頭就是各項協議內容,具體的協議內容不會每次都使用全部
1)Host:請求的主機地址(必須)
2)Accept:當前請求能夠接受服務器返回的類型(MIME類型)
3)Accept-Language:接收的語言
4)User-Agent:客戶瀏覽器電腦的一些信息
請求頭不固定,每個請求協議也是獨佔一行,最後會有一行空行(用來區分請求頭和請求體)
請求體
請求數據:POST請求纔會有請求體。GET請求所有的數據都是跟在URL之後,會在請求行中的資源路徑上體現。
基本格式:資源名字=資源值&資源名字=資源值…
HTTP響應
響應行
1)形式:協議版本號 狀態碼 狀態信息
2)200 ok:成功
3)403 Forbidden:沒權限訪問
4)404 Not Found:未找到頁面
5)500 Server Interval Error:服務器內部錯誤
響應頭
具體協議內容
1)時間:Wed 16 Sep 2018 11:43:33 GMT
2)服務器 Server:Apache/2.4(win64) PHP/7
3)內容長度 Content-Length:1571,數據具體的字節數(響應體)
4)內容類型 Conetent-Type:告訴瀏覽器對應的數據格式
列舉了幾個常見的響應頭,並不是全部:響應頭一個佔一行,最後一行空行(區分響應頭和響應體)
響應體
實際服務器響應給瀏覽器的內容
常見的HTTP狀態碼
狀態碼 200:成功
狀態碼 403:forbidden,拒絕訪問(沒有權限)
狀態碼 404:not found,找不到頁面
狀態碼 500:服務器問題
W3C裏面的HTML下面的HTTP消息,查看狀態碼
1XX:信息 2XX:成功 3XX:重定向 4XX:客戶端錯誤 5XX:服務器錯誤
HTTP響應
常見的HTTP響應設置及使用
PHP中針對HTTP協議(響應)進行了底層設計,可以通過函數header來實現修改HTTP響應(響應頭)
注意事項:
1、Header可以設計HTTP響應,因爲HTTP協議特點是:響應行、響應頭(空行結尾),響應體。認爲通過header設計響應頭的時候,不應該有任何內容輸出,所以一旦產生內容輸出(哪怕是一個空格),系統都回認爲響應頭已經結束而響應體開始了,所以如果先輸出內容後設置響應頭(header使用),理論設置無效。
2、在PHP5以後,增加程序緩存內容:允許服務器腳本在輸出內容的時候,不直接返回給瀏覽器而是現在服務器端使用程序緩存保留(php.ini中使用output_buffering),有了該內容之後,在程序緩存內會自動調整響應頭和響應體(允許響應頭在已經輸出的內容之後再設置),但是此時會報錯(警告)。
總結:header設置響應體之前不要有任何輸出。
Location:重定向,立即跳轉(響應體不用解析)
瀏覽器在解析服務器響應的時候:先判定響應行,繼續響應頭,最後響應體:location是在響應頭中,所以瀏覽器一旦見到該協議項,不再向下解析。
Refersh:重定向,定時跳轉(響應體會解析)
延時重定向:瀏覽器會根據具體時間延遲後在訪問指定跳轉鏈接:瀏覽器在準備跳轉訪問之前,會繼續解析HTTP協議(響應頭和響應體)
Conetent-type:內容類型,MIME類型
通過內容告知(MIME類型),瀏覽器正確解析內容
Content-disposition:內容類型,MIMIE類型擴展,激活瀏覽器文件下載對話框。
瀏覽器在解析內容的時候,默認是直接解析:那麼有時候需要瀏覽器不解析,當做內容下載成文件
PHP模擬HTTP請求
原理
PHP可以通過模擬HTTP協議發起HTTP請求
CURL是一個非常強大的開源庫,支持很多協議,包括HTTP、FTP、Telnet等,我們使用它來發送HTTP請求。它給我們帶來的好處是可以通過靈活的選項設置不同的HTTP協議參數,並且支持HTTPS。CURL可以根據URL前綴是“HTTP”還是“HTTPS”自動選擇是否加密發送內容
前提條件:HTTP協議是客戶端/服務端模式,HTTP協議不侷限於一定要瀏覽器訪問。
Curl擴展庫使用
1、開啓CURL擴展
2、有的時候,PHP版本會出現即使開啓了擴展也無法使用擴展的可能:因爲CURL找不到對應的dll文件,需要將相關DLL文件放在C:\windows
3、重啓Apache應用
1)建立連接:curl_init():激活一個CURL連接功能
2)設置請求選項:curl_setopt():設定選項
CURLOPT_URL:需要獲取的 URL 地址,也可以在curl_init() 初始化會話的時候。
CURLOPT_RETURNTRANSFER:將服務器執行的結果(響應)以文件流的形式返回給請求界面(PHP腳本)
CURLOPT_POST :是否採用POST方式發起請求(默認請求是GET)
CURLOPT_POSTFIELDS:用來傳遞POST提交的數據。分爲兩種方式:字符串(name =abc&password=123)以及數組形式(array(‘name’=>’abc’,…))
CURLOPT_HEADER:是否得到相應的header信息(響應頭),默認不獲取。 啓用時會將頭文件的信息作爲數據流輸出。
3)執行請求:curl_exec():執行選項(與服務器發起請求),得到服務器返回的內容
如有亂碼,加一個header('Content-type:text/html;charset=utf-8');
4)關閉連接:curl_close():關閉資源