寬帶套餐怎么辦理最劃算seo是什么意思為什么要做seo
Http請求結(jié)構(gòu):
結(jié)構(gòu)圖1:
?實驗解析請求報文:
1.在Edge瀏覽器上輸入ip地址+端口號+文件資源,也就是下圖中的120.XX.139.29:8888/A/B/c.html
2.我的程序接收到了一個沒有有效載荷的http請求(呼應上面的結(jié)構(gòu)圖1),如下
GET /1/2/3.html HTTP/1.1? ? ? //請求行(請求方法+請求資源+協(xié)議版本)
Host: 120.46.139.29:8888? ? ?//請求的目的主機+端口號
Connection: keep-alive? ? ? ? ?//鏈接模式
Upgrade-Insecure-Requests: 1??
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36 Edg/114.0.0.0? ?//操作系統(tǒng)信息+瀏覽器信息,這也就是當你用瀏覽器下載app的時候他自動能識別你需要ios還是安卓。
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Accept-Encoding: gzip, deflate? ? //客戶端可以接收的編碼類型
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6? ?//編碼符號
3.關閉我的HttpServer程序
Http響應結(jié)構(gòu):
結(jié)構(gòu)圖2:
代碼塊1:
const std::string SEP="\r\n";std::string HandlerHttp(const std::string& request)
{//前提:request一定是一個完整的請求報文。//給別人返回的是一個http response;std::cout<<"------------------------------------"<<std::endl;std::cout<<request<<std::endl;std::string response;response+="HTTP/1.1 200 OK"+SEP;//報頭response+=SEP;//空行response+="<html><body><h1>This is a test!</h1></body></html>";//正文return response;
}
我自己的服務器在收到http請求時,給客戶端返回響應,正文是<html><body><h1>This is a test!</h1></body></html>,被瀏覽器解釋后就會出現(xiàn)下圖這樣的樣子;因為正文部分使用了html,一種描述網(wǎng)頁的語言;
深入理解:
空行能讓報頭和正文被區(qū)分,從而識別出收到的請求或相應的正文開頭。
但是當多個http請求同時發(fā)送給服務器的時候,如果不知道正文有多長就無法有效識別正文,那怎么才能知道正文讀沒讀取完呢?答案是在響應報頭中有Content-Length代表Body的長度;
這里想一個問題在上面的代碼中,我的服務器在給瀏覽器返回響應時,響應報頭中并沒有帶正文長度,那瀏覽器是如何準確讀取完正文的呢?答案是瀏覽器很牛逼不用我們操心。不過我們可以在上面代碼塊1的基礎上加上Content-Length,再進行測試。
代碼塊2:
std::string HandlerHttp(const std::string& request)
{//前提:request一定是一個完整的請求報文。//給別人返回的是一個http response;std::cout<<"------------------------------------"<<std::endl;std::cout<<request<<std::endl;std::string body="<html><body><h1>This is a test!</h1></body></html>";//正文std::string response;response+="HTTP/1.1 200 OK"+SEP;//報頭response+="Content-Length: "+std::to_string(body.size())+SEP;//報頭-content_length;response+=SEP;//空行response+=body;//正文return response;
}
測試:
1.發(fā)送http請求
2.查看響應
XML格式:
網(wǎng)頁預覽版:
?可以看到報頭中有了Content-Length;
?
在服務器里面的所有資源都以文件的形式存在,當服務器找到了用戶所申請的資源就會返回響應。響應報頭中還會攜帶Content-Type以表示文件是什么類型的,好讓用戶的瀏覽器接收到響應后正確解析資源。
代碼塊3:
在代碼塊2的基礎上再加上Content-Type。
std::string HandlerHttp(const std::string& request)
{//前提:request一定是一個完整的請求報文。//給別人返回的是一個http response;std::cout<<"------------------------------------"<<std::endl;std::cout<<request<<std::endl;std::string body="<html><body><h1>This is a test!</h1></body></html>";//資源,網(wǎng)頁,視頻,音頻->本質(zhì)上都是文件,都要有自己的后綴。std::string response;response+="HTTP/1.1 200 OK"+SEP;//狀態(tài)行response+="Content-Length: "+std::to_string(body.size())+SEP;//報頭-content_length;response+="Content-Type: text/html"+SEP;response+=SEP;//空行response+=body;//正文return response;
}
可以看到響應body自動被識別成html了。
報頭屬性數(shù)量也變成兩個了。?
?
?但是像上面代碼那樣,把資源寫在程序里面顯然是不現(xiàn)實的,難不成每次更新資源都需要重新編譯程序,然后重新啟動服務器?所以服務器Http服務器必須從文件里面讀取資源。
為了避免文章太長影響觀感,所以分多部分敘述,請看下文。
HTTP-中
參考:
1.URL:統(tǒng)一資源定位符(Uniform Resource Locator)統(tǒng)一資源定位系統(tǒng)是專為標識Internet網(wǎng)上資源位置而設置的一種編址方式,平時所說的網(wǎng)頁地址指的即是URL。 統(tǒng)一資源定位符是對可以從互聯(lián)網(wǎng)上得到的資源的位置和訪問方法的一種簡潔的表示,是互聯(lián)網(wǎng)上標準資源的地址?;ヂ?lián)網(wǎng)上的每個文件都有一個唯一的URL,它包含的信息指出文件的位置以及瀏覽器應該怎么處理它。
2.所有字符都需要編碼,利用二進制代表字符。例如ASCLL碼或者UTF8,因為計算機只認識二進制。
3.URL編碼Encode,解碼Decode。
?