1.1HTTP協(xié)議的概念
客戶端和服務(wù)器端溝通的規(guī)范:
為什么要有這個(gè)規(guī)范目派?
答:網(wǎng)站應(yīng)用在運(yùn)行的過程中憾股,服務(wù)器端需要知道客戶端請求了什么,客戶端知道服務(wù)器端響應(yīng)了什么庵佣,不能雞同鴨講。需要一個(gè)雙方都能聽懂的語言汛兜。
HTTP協(xié)議:超文本傳輸協(xié)議巴粪,規(guī)定了如何從網(wǎng)站服務(wù)器傳輸超文本到本地瀏覽器,它基于客戶端服務(wù)器架構(gòu)工作粥谬,是客戶端(用戶)和服務(wù)器端(網(wǎng)站)請求和應(yīng)答的標(biāo)準(zhǔn)肛根。
1.2報(bào)文
客戶端和服務(wù)器端在進(jìn)行請求和響應(yīng)過程中,所攜帶的數(shù)據(jù)塊漏策,倆者對話的說明以及內(nèi)容派哲。
報(bào)文:請求報(bào)文、響應(yīng)報(bào)文
請求報(bào)文:客戶端向服務(wù)器端發(fā)送請求所攜帶的數(shù)據(jù)塊(客戶端對服務(wù)器所說的話)
響應(yīng)報(bào)文:服務(wù)器端對客戶端進(jìn)行響應(yīng)所攜帶的數(shù)據(jù)塊(服務(wù)器對客戶端說的話)
數(shù)據(jù)塊:包含了請求和響應(yīng)的相關(guān)信息掺喻,比如用戶在登錄時(shí)輸入的用戶名和密碼被包含在請求數(shù)據(jù)塊中進(jìn)行傳遞的芭届。當(dāng)前登錄時(shí)成功還是失敗就包含在響應(yīng)數(shù)據(jù)塊中储矩。
報(bào)文在傳輸過程中。遵循規(guī)定的格式喉脖,以? ?:進(jìn)行分割的鍵值對
在哪能看到報(bào)文信息椰苟?
借助瀏覽器提供的開發(fā)者工具:Network,刷新瀏覽器
顯示:search.html
search.jpg
favicon.ico
隨便打開一個(gè)請求search.html(點(diǎn)擊)
在右側(cè)出現(xiàn)Headers Preview Response Cookies Timing
點(diǎn)擊Headers?
顯示:General? ? ? ? ? ? ? ? ? ? ? // 顯示比較重要的信息树叽,核心的信息
Response Headers(7)? ? ? ? ?// 響應(yīng)報(bào)文(服務(wù)器端對客戶端)
Request Headers(11)? ? ? ? ?// 請求報(bào)文(客戶端對服務(wù)器端)
打開Request Headers(11)?
顯示: Accept:? ? ? ? ? ? ? ? ? ? ? ? ? // 接收(告訴服務(wù)器端當(dāng)前客戶端能接收html文件舆蝴,圖片以及一些其他文件)
點(diǎn)擊Response
顯示的服務(wù)器端響應(yīng)給客戶端具體的內(nèi)容
1.3請求報(bào)文
①請求方式:GET 請求數(shù)據(jù)、POST 發(fā)送數(shù)據(jù)
PS:請求方式就是一種標(biāo)識题诵,告訴服務(wù)器端當(dāng)前這次請求要做的這個(gè)事情的類型洁仗,比如說獲取數(shù)據(jù)的請求(一般都用GET),如果是添加數(shù)據(jù)的請求(就要POST)性锭,如果都不是赠潦,而是網(wǎng)站中的一般邏輯,比如登入操作(也用POST)
PS:POST這種方式相對GET要安全一些草冈。
客戶端如何向服務(wù)器端發(fā)送get或者post請求呢她奥?
最常見的get請求,就是通過瀏覽器中的地址通過輸入網(wǎng)址的方式怎棱,如何證明哩俭?
服務(wù)器端能獲取客戶端請求方式。
req:就是請求對象拳恋,它包含了請求相關(guān)的信息凡资,其中就包含了請求方式。
如何獲取請求方式谬运?
req.method
app.js中? console.log(req.method);
打開網(wǎng)站:localhost:3000
命令行窗口:有請求方式輸出GET
疑惑:為什么有2個(gè)GET輸出隙赁?1個(gè)是輸入localhost請求,1個(gè)是瀏覽器自帶圖標(biāo)請求
如何發(fā)送post請求梆暖?
在server文件夾下新建form.html文件伞访,并生成html頭
<!--
method:指定當(dāng)前表達(dá)提交的方式
action:指定當(dāng)前表達(dá)提交的地址
-- >
<form method="post" action="http://loaclhost:3000">
<input type="submit" name="">
</form>
在瀏覽器中打開這個(gè)頁面,命令行窗口就有post請求
證明了提交的表達(dá)確實(shí)是post請求轰驳。
疑惑:在post請求后為什么會(huì)有GET請求厚掷,在POST請求發(fā)送完后,表單發(fā)生了一個(gè)默認(rèn)行為滑废,其實(shí)就是表單的一個(gè)跳轉(zhuǎn)行為(表單的跳轉(zhuǎn)行為默認(rèn)是一個(gè)GET方式)
服務(wù)器拿到GET請求蝗肪,POST請求有什么用?
答:如果請求的地址是相同的蠕趁,那么請求的方式是不同的薛闪,那根據(jù)這個(gè)請求的方式,響應(yīng)不同的內(nèi)容
app.js中
if(req.method == 'POST'){
? ? ? ?res.end('post')
}else if(req.method == 'GET'){
? ? ? ?res.end('get')
}
?// res.end('<h2>hi,user</h2>');
瀏覽器打開localhost3000
得到get
瀏覽器打開form.html,提交表單(提交到了localhost:3000這個(gè)地址)
得到post
切換到瀏覽器中:輸入localhost:3000/index
返回:get
切換到瀏覽器中:輸入localhost:3000/list
返回:get
此時(shí)客戶端無論訪問什么地址俺陋,返回的都是相同的內(nèi)容豁延。怎么訪問不同的內(nèi)容呢?
怎么能訪問index,返回首頁內(nèi)容呢昙篙?如果用戶訪問的地址不存在,返回頁面沒有找到诱咏,這個(gè)需求怎么實(shí)現(xiàn)苔可?
答:服務(wù)器端要獲取到客戶端的請求地址,
req.url? ?// 獲取請求地址
切換到編輯器中
app.js中
console.log(req.url)袋狞;
切換到瀏覽器中焚辅,訪問/index
切換到命令行窗口
顯示/index
if(req.url == '/index'){
? ? ? ? ?res.end('welcome to homepage');
}else if(req.url=='/list'){
? ? ? ? ?res.end*('wekcome to listpage');
}else{
? ? ? ? res.end('not found');
}
回到瀏覽器中:訪問/index
顯示:welcome to homepage
回到瀏覽器中:訪問/list
顯示:welcome to listpage
回到瀏覽器中:訪問/xxxxx
顯示:not found
回到瀏覽器中:訪問(不輸入)
顯示:not found
回到命令行工具窗口:
顯示:/
如果什么也不寫,想訪問到首頁
if(req.url == '/index' || req.url =='/'){
?? ?res.end('welcome to homepage');
}else if(req.url=='/list'){
?? ? ?res.end*('wekcome to listpage');
}else{
?? res.end('not found');
}
驗(yàn)證:成功
req.headers? ?// 請求報(bào)文信息
app.js
console.log(req.headers);
切換到瀏覽器中苟鸯,刷新頁面
切換到命令行窗口:有2個(gè)對象輸出
獲取報(bào)文信息里具體的某一項(xiàng)
app.js
console.log(req.headers['accept']);
刷新頁面同蜻,切換到命令行窗口,得到該項(xiàng)信息
3.4響應(yīng)報(bào)文
1.HTTP狀態(tài)碼
·200請求chg
·404請求的資源沒有找到
·500服務(wù)器端錯(cuò)誤
·400客戶端請求有語法錯(cuò)誤
PS:默認(rèn)情況下服務(wù)器端沒有返回狀態(tài)碼早处,就是成功的湾蔓,沒有問題的。
CSS文件砌梆,圖片文件沒有找到:返回404錯(cuò)誤默责,明確告訴這個(gè)資源沒有找到,在瀏覽器的控制臺(tái)中也會(huì)報(bào)一個(gè)紅色的錯(cuò)誤咸包。
500錯(cuò)誤和客戶端一般沒有什么關(guān)系桃序,服務(wù)器端在運(yùn)行時(shí)哪個(gè)一個(gè)地方的代碼報(bào)錯(cuò)了,就會(huì)返回一個(gè)500的錯(cuò)誤诉儒,告訴客戶端服務(wù)器出現(xiàn)了問題葡缰。
400錯(cuò)誤代表客戶端的請求語法有問題亏掀,比如說請求路徑寫錯(cuò)了或者說請求參數(shù)不匹配忱反,都可以返回400錯(cuò)誤。
在瀏覽器的開發(fā)者工具中能夠看到:Network第二項(xiàng)Status
=============================================
嘗試在服務(wù)器端為客戶端設(shè)置不同的狀態(tài)碼
切換代碼編輯器中:
res.wirteHead();
res.wirteHead(500);
res.wirteHead(400);?
PS:HTTP狀態(tài)碼就是一種標(biāo)識滤愕,在返回時(shí)要把狀態(tài)碼設(shè)置成多少温算,完全取決于當(dāng)前的警告。
2.內(nèi)容類型
內(nèi)容類型設(shè)置
·text/html
·text/css
·application/javascript? ? ? ? ? ? ? ? ? ?// 返回javascript文件
·image/jpeg
·application/json
·text/plain? ? ? ? ? ? ?// 默認(rèn)
在writeHead()方法中间影,除了第一個(gè)參數(shù)狀態(tài)碼以外注竿,它還有第二個(gè)參數(shù),是一個(gè)對象(寫的是響應(yīng)頭里的信息(響應(yīng)報(bào)文的信息'content-type':text/plain))(PS:此處代表純文本魂贬,不指定巩割,默認(rèn)是純文本)
重點(diǎn):通過設(shè)置res:writeHead(200,{
? ? ? ? ? ? 'content-type':'text/html'
});
使res.end('<h2>ni hao</h2>');輸出ni hao
警告:里面是中文會(huì)出現(xiàn)亂碼!8对铩宣谈!在做網(wǎng)頁開發(fā)時(shí)一般編碼都是utf-8,這個(gè)時(shí)候我們需要把這個(gè)編碼指定键科。
res:writeHead(200,{
? ? ? ? ? ? 'content-type':'text/html闻丑;charset=utf-8'
});
回到瀏覽器中漩怎,亂碼問題被解決。