HTTP協議
超文本傳輸協議(HTTP,HyperText Transfer Protocol)
最常見B/s架構中,使用,瀏覽器端與服務器端數據交互協議。
協議:約定好的一套語法規則。
規定:請求數據格式,與響應數據格式。
是應用層協議
請求協議
規范,瀏覽器向服務器發送數據格式
以上內容,就是瀏覽器在向服務器的http://shop.kang.com/index.php?p=back&c=Admin&a=login請求時,所發送的數據。
請求數據分成三部分(列子中其實2個部分):
請求行:request_line
請求數據的第一行,用來說明當前請求的最基本信息。
由三塊組成:
GET /index.php?p=back&c=Admin&a=login HTTP/1.1 換行
方式 資源地址(沒有域名) 協議版本 \r\n(回車換行CRLF)
請求頭:request_header
請求頭信息,請求標頭
瀏覽器需要傳輸給服務器的屬性數據。
# 主機,請求的主機。用於標識一台web服務器上的其中一個虛擬主機的。
Host: shop.kang.com
# 用戶代理UA,什么發出的請求。
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:35.0) Gecko/20100101 Firefox/35.0
# 可以接受的內容類型
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
# 可以接受的語言
Accept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3
# 可以接受的數據編碼類型(壓縮編碼)
Accept-Encoding: gzip, deflate
# 攜帶的cookie數據
Cookie: PHPSESSID=i76sa2297sp1adlfk3e4eja612
# tcp連接類型 keep-alive保持激活
Connection: keep-alive
# Keep-Alive: 30 保持連接的時間段秒
# 緩存控制選項
Pragma: no-cache
Cache-Control: no-cache
注意語法格式:
頭,由標識與內容組成,使用冒號分隔(標識與冒號間不能存在空格)
每個頭占用一行,行結尾,使用CRLF(回車換行\r\n)
可以存在多個頭。
頭信息結束使用空行標志
請求主體:request_content
請求的主要用戶數據。
就是POST數據。
如果方式為POST,則需要請求主體部分,(GET沒有請求主體)
操作請求
通過瀏覽器所攜帶屬性,完成特定功能。
多語言程序(I18n,國際化程序)
項目:提供多套語言版本。
瀏覽器:請求時,攜帶屬性,告知服務器,需要那種語言。
通過請求頭:Accept-Language 告知服務器,希望使用的語言。
項目:可以獲取瀏覽器需要的語言,載入相應的語言包,做展示。
獲取:
找到最佳匹配:
項目存在默認的語言。(瀏覽器需要的,項目都沒有提供)
確定瀏覽器可以接受的語言列表,找到服務器中,最匹配(權重依次匹配)
PHP發出請求(模擬請求)
采集程序。
公共平台開發。
發出請求:
連接目標服務器,發送符合請求協議格式的數據。
服務器就會將其視為請求,發出響應!
連接:
Fsockopen();建立一個internet連接
處理請求數據:
向服務器發送,發出請求。
通過函數 fwrite即可完成。(fwrite可以向文件和網絡資源位置發送數據)
獲取服務器的響應數據
使用 fgetS()完成:
Feof,(end of file)用於檢測是否到到數據流末尾。
斷開連接
POST請求
存在請求主體數據。
請求行:POST
請求頭:存在對請求主體的描述
請求主體:post數據
CURL-Client URL
PHP擴展。
可以用來模擬URL客戶端(瀏覽器,請求代理)的工具擴展。
開啟擴展
Apacherestart
Tip:
依賴類庫:
Php目錄:
將以上文件拷貝到系統目錄(windows中),將php目錄設置為path環境變量。
模擬GET
Curl資源 = curl_init()初始化curl
curl_setopt(curl資源,選項標志,選項值)
curl_exec(資源)發出請求
curl_close()關閉資源
POST請求
處理響應數據
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);//
請求執行時,不是將響應直接輸出,而是以返回值的形式處理。
POST文件上傳
Post數據使用文件地址,前使用@標志為文件而不是字符串。
處理響應頭
CURLOPT_HEADER:是否獲取響應頭數據
處理會話COOKIE
(模擬登錄)
接收服務器設置的cookie,並存儲於請求代理端:
CURLOPT_COOKIEJAR 指定存儲服務器所設置的cookie變量存儲位置。
發出請求時攜帶擁有的cookie:
CURLOPT_COOKIEFILE
請求時攜帶的cookie數據所在的位置。
響應協議
也是三部分:
1響應行2響應頭3響應主體
響應行
響應數據的第一行,響應結果的概述
http/1.1 302 FoundCRLF
版本 響應狀態碼 響應消息
響應狀態碼,和響應消息,一一對應。
302 Found:重定向,配合響應頭Location使用。
404 Not Found:請求資源不存在。
403 Forbidden:沒有權限訪問該地址
200 ok: 請求成功
500 Server Internal Error: 服務器內部錯誤
響應頭
服務器告知瀏覽器屬性信息。
響應主體
主體數據(通過瀏覽器的查看源代碼所看到的內容)
操作響應
操作響應頭,header()可以
操作響應主體,任何的輸出,都是響應主體。(echo, print,var_dump,PHP標簽之外的所有HTML代碼)
控制器瀏覽器緩存
Expires:有效期,時間點,GMT時間,格林威治平時。
Gmdate() 將時間戳格式化為格林威治平時。
D,星期
M,月(三個英文月)
HTTP下載
下載:文件從服務器端傳輸到瀏覽器端。發生於服務器響應時。
PHP僅僅需要將需要下載的內容作為響應主體輸出即可。
通過響應頭:Content-Disposition:告知瀏覽器,接受到響應主體后的處理方式。
值:attachment 表示以附件的方式處理響應主體。
如果是文件的下載:
將文件內容作為響應主體輸出即可!
控制下載的文件名(默認為請求的腳本名)
控制主體類型:
細致控制:
主體大小。