- HTTP狀態(tài)碼
- HTTP數(shù)據(jù)報的構(gòu)造
JavaEE & HTTP狀態(tài)碼 & HTTP數(shù)據(jù)報的構(gòu)造
1. HTTP狀態(tài)碼
c語言也學(xué)到了一個全局的變量errno,在一些內(nèi)存函數(shù)或者文件操作的時候,這個變量會有所變化,如果程序出錯了,這個變量對應(yīng)的值就代表了對應(yīng)的錯誤信息,【errno - error no(number)】,通過一些函數(shù)去解析這個錯誤碼就可以了~
而HTTP的狀態(tài)碼,就是反應(yīng)網(wǎng)頁的狀態(tài)的(正確以及錯誤…)
- 比如你所熟知的404,就是找不到這個網(wǎng)頁的意思~
- 而瀏覽器一般遇到錯誤信息,頁面是打不開的,就會打印狀態(tài)碼和錯誤信息
- 當(dāng)然,HTTP的狀態(tài)碼不僅僅只有這個,還有很多~
傳送門1:HTTP 響應(yīng)狀態(tài)碼 - HTTP | MDN (mozilla.org)
傳送門2:HTTP 狀態(tài)碼 | 菜鳥教程 (runoob.com)
可見,狀態(tài)碼的數(shù)量很多很多,但是我們并不需要掌握那么多,我們只需要掌握大概的意思,以及個別常見的狀態(tài)碼的含義即可~
1.1 200 - OK
- 表示的是請求成功
抓包:
- 抓到很多狀態(tài)碼為200的包~
1.2 404 - Not Found
- 表示訪問的資源不存在~
抓包:
b站的404錯誤信息則是顯示成這樣的:
-
一些網(wǎng)站對應(yīng)這些狀態(tài)碼的打印提醒比較獨特
-
這個響應(yīng)的正文,就是這個頁面~
1.3 403 - Forbidden
- 表示的含義就是,訪問被拒絕,沒有權(quán)限
以碼云為例:
- 私有項目別人是沒有權(quán)限訪問的
別人訪問的話:
1.4 500 - Internal Server Error
- 服務(wù)器內(nèi)部錯誤
- 在互聯(lián)網(wǎng)上不容易見到,但是在你自己寫代碼的過程中,你的服務(wù)器經(jīng)常bug,拋了異常沒catch,就會500~
在我們寫的第一個Servlet程序的時候,就演示過這個500
- 所以我們寫代碼要catch,不然是直接讓整個網(wǎng)頁掛了,catch到服務(wù)器那顯示錯誤信息打印日志就行了~
博客片段:
1.5 504 - Gateway Timeout
- 表示服務(wù)器訪問超時
- 瀏覽器給服務(wù)器發(fā)請求,服務(wù)器要響應(yīng)才對,如果這個等待請求的時間異常,就會504
這就是超時重傳后,又又又超時的“放棄訪問”
- 熱門的時間點,搶火車票的時候就可能會出現(xiàn)
1.6 302/301 重定向
302:Move temporarily 臨時重定向
301:Moved Permanently 永久重定向
重定向是什么?
- 有一個笑話:一個男孩給喜歡的女孩送早餐,然后這個女孩就將這份早餐送給她喜歡的男孩,這就是重定向
- 如果這個男孩是個舔狗,這個女孩如果一直不告訴這個男孩這件事情,那么就是永久重定向,如果是良心發(fā)現(xiàn),就是臨時重定向~
- 另一個例子:呼叫轉(zhuǎn)移
- 我原本的一個手機(jī)號:135xxxx,后來我改了手機(jī)號153xxxx,但是我的好友只知道我的舊號碼呀,那么我們就可以到營業(yè)廳,做一個業(yè)務(wù)“呼叫轉(zhuǎn)移”,好友撥打135xxxx重定向到153xxxx
臨時:下次要不要繼續(xù)重定向?不清楚
永久:以后都重定向
所以重定向就是,訪問舊地址被自動引導(dǎo)到新地址上~
抓包:
- 在學(xué)校一些教務(wù)系統(tǒng)上就有,因為有些是有舊版本的,所以要重定向到新版本
這些就是常見的狀態(tài)碼了,其他遇到了再去查~
傳送門1:HTTP 響應(yīng)狀態(tài)碼 - HTTP | MDN (mozilla.org)
傳送門2:HTTP 狀態(tài)碼 | 菜鳥教程 (runoob.com)
HTTP協(xié)議的標(biāo)準(zhǔn)文檔中,還有一個特殊的狀態(tài)碼,418(彩蛋,隱藏劇情)
- teapot其實就是彩蛋的意思
在百度搜“黑洞”:
2. 構(gòu)造HTTP請求
- 至于HTTP響應(yīng),就得有HTTP服務(wù)器和收到請求才行,在Tomcat,Servlet中我們重寫對應(yīng)方法,計算和設(shè)置響應(yīng)信息后,就會幫我們發(fā)去客戶端
2.1 瀏覽器搜索欄輸入url
- 這樣就會構(gòu)造出一個GET請求~
2.2 HTML中,一些特殊標(biāo)簽
- link標(biāo)簽
- script標(biāo)簽
- img標(biāo)簽
- a標(biāo)簽
都是向網(wǎng)絡(luò)索取資源的~
以我們做過的博客系統(tǒng)頁面為例子:
這就是script發(fā)出的一個GET請求,去網(wǎng)絡(luò)上索取jQuery
- 本地資源就不會觸發(fā)~
2.3 form表單
- HTML中,form標(biāo)簽頁能構(gòu)造請求(GET/POST…)
例子:
效果:
抓包:
- 這個url問號后面的query string就是兩個input的對應(yīng)關(guān)系(由于沒輸入,所以是空值)~
- name=value
- 層級路徑就是action
- 方法就是method
構(gòu)造POST:
不在query string,而是在body:這里aaa和abc對應(yīng)空值,就是因為輸入框我沒輸入數(shù)據(jù)~
而且它有個Content-Type:application/x-www-form-urlencoded
form只支持get和post方法,其他的put 、delet 、options都無能為力~
使用form的話,版本號固定是HTTP/1.1
2.4 ajax【重要】
- 現(xiàn)在最主流的前后端交互方式之一
Ajax即Asynchronous Javascript And XML(異步JavaScript和XML)
- 在 2005年被Jesse James Garrett提出的新術(shù)語,用來描述一種使用現(xiàn)有技術(shù)集合的‘新’方法,包括: HTML 或 XHTML, CSS, JavaScript, DOM, XML, XSLT, 以及最重要的XMLHttpRequest。使用Ajax技術(shù)網(wǎng)頁應(yīng)用能夠快速地將增量更新呈現(xiàn)在用戶界面上,而不需要重載(刷新)整個頁面,這使得程序能夠更快地回應(yīng)用戶的操作。
XML
- Servlet編程maven的pom.xml為例
- 是一種標(biāo)簽形式的自定義數(shù)據(jù)格式
![]()
html來說,支持哪些標(biāo)簽,是啥含義,是標(biāo)準(zhǔn)委員會規(guī)定的
而xml的標(biāo)簽都是自定義的~
Asynchronous,異步
- synchronize,同步
同步異步的含義:
- 同步與互斥(加鎖的場景)
- 同步與異步(IO的場景)
- 同步:請求的發(fā)起者主動獲取這個響應(yīng)(從服務(wù)器拿來)
- 這里的同步是指主動拿來之后就可以直接用這份響應(yīng),與原計劃同步
- 異步請求的發(fā)氣質(zhì)被動獲取這個響應(yīng)(服務(wù)器推送過來)
- 這里的異步是指被動獲取之后,不一定立即用到這份響應(yīng),排在計劃后面,與原計劃異步
js提供了原生的ajax的api,這個api賊難用(不講)
- 用jQuery的ajax和api就好啦
即調(diào)用ajax函數(shù),傳參是一個大括號包住的一個東西,就是JS中的“對象”
- 而里面的success就是之前說將的“函數(shù)指針”,這也就是一個回調(diào)函數(shù),就是在ajax代碼體中合適的時間調(diào)用這個函數(shù)!
- 即ajax代碼中的某一段邏輯是未定義的,是由這個函數(shù)來定義的~
- 這類似于C語言的函數(shù)指針,類似于Java傳參中的”對象”(比如lambda表達(dá)式,run方法,迭代器,比較器…)
這也是異步的原因,因為這個是我們“丟個函數(shù)”進(jìn)去,讓瀏覽器調(diào)用這個ajax,發(fā)送一個請求,之后瀏覽器獲取到正確響應(yīng)后自動執(zhí)行這個success函數(shù),執(zhí)行處理響應(yīng)的一些邏輯(body就是響應(yīng)的正文),將響應(yīng)“喂”給我們的代碼,這個過程我們是被動的~
/*測試代碼*/
<script>
// $ 即jQuery的別名
$.ajax(
{
url: "https://www.baidu.com",
type: "GET",
data: "this is body",
contentType: "text/plain",
success: function(body) {
//寫處理響應(yīng)的代碼
console.log(body);
}
}
);
</script>
打開html按f12:
- 這個錯誤的原因是請求發(fā)都沒有發(fā):
抓包:
這個是屬于ajax的一個非常典型的問題: “跨域問題”
- 現(xiàn)在運行的ajax的代碼的頁面域名與ajax里面的請求訪問的域名不一致的話,(不是要求路徑一模一樣,而是域名一樣,不如百度頁面發(fā)出的請求得是百度內(nèi)部的,反正都是baidu.com),哪怕服務(wù)器給你響應(yīng)了數(shù)據(jù),瀏覽器還是不能處理這個數(shù)據(jù),而是直接報錯~
- 這個不是bug,而是瀏覽器考慮到安全問題做出的限制
- 一般頁面的跳轉(zhuǎn)也不需要用到ajax,用其他的就行了(form則沒有這個限制)
- 在以后,在自己的頁面發(fā)請求給自己的服務(wù)器,自然不會出現(xiàn)這個 “跨域問題”~
構(gòu)造HTTP請求,不僅僅是js可以構(gòu)造,java也可以構(gòu)造,C++也能,任何一個可以操作網(wǎng)絡(luò)的語言,都可以構(gòu)造http請求,所以爬蟲不僅僅只有python能做到
2.5 Postman
前面的方法都是通過寫代碼去實現(xiàn)的,有沒有一種方法,不寫代碼也能發(fā)送請求呢?
- 有,使用一個軟件—Postman
下載傳送門:Download Postman | Get Started for Free
- 然后注冊賬號登錄一下~(云存檔)
他甚至有對象 — Postwoman
- 有興趣的可以去了解一下
操作流程:
- 你會發(fā)現(xiàn)創(chuàng)建不了public,但是可以創(chuàng)建其他,這是因為public不允許中文~
- 改為英文/數(shù)字/其他字符既可以
- 這里我把名字改為mara-ring
創(chuàng)建標(biāo)簽頁:
在這里構(gòu)造http請求:
點擊save改名:
選擇請求的“方法”:
創(chuàng)造query string:
創(chuàng)造header:
構(gòu)造body:
- 也可以模擬form表單請求的body
- none—無body
由于不是瀏覽器,所以沒有cookie設(shè)置也很正常
- 但是響應(yīng)是有cookie的~
獲取響應(yīng):
fiddler抓包:
可見請求沒有cookie,響應(yīng)首行沒有方法和url,只有版本號和狀態(tài)碼和狀態(tài)碼描述
補(bǔ)充:HTTP響應(yīng)的首行比請求的首行多了一個部分:就是空格分割的狀態(tài)碼和狀態(tài)碼描述
因為這個軟件不是瀏覽器~
如果你對http報文格式特別熟悉,那么Postman的使用就不是問題~
Postman還有一個特別牛的功能:自動生成代碼
HTTP請求報文:
構(gòu)造ajax:
后面不是Native的,前提是要安裝對應(yīng)的庫!
文章到此結(jié)束!謝謝觀看
可以叫我 小馬,我可能寫的不好或者有錯誤,但是一起加油鴨??!文章來源:http://www.zghlxwxcb.cn/news/detail-470606.htmlHTTP的知識就講到這里了,下一個章節(jié):HTTPS~文章來源地址http://www.zghlxwxcb.cn/news/detail-470606.html
到了這里,關(guān)于【JavaEE】HTTP狀態(tài)碼-HTTP數(shù)據(jù)報的構(gòu)造的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!