PHP核心編程——瞭解HTTP協議與模擬HTTP請求

HTTP協議

目錄

HTTP協議

HTTP協議概念

HTTP協議特點

HTTP協議分類

HTTP請求

請求行

請求頭

請求體

HTTP響應

響應行

響應頭

響應體

常見的HTTP狀態碼

HTTP響應

常見的HTTP響應設置及使用

PHP模擬HTTP請求

原理

Curl擴展庫使用


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():關閉資源

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章