情景描述
- 使用nginx反向代理服務(wù)器
- 服務(wù)器支持https協(xié)議
- 發(fā)送請(qǐng)求的時(shí)候?qū)rl寫(xiě)成了http開(kāi)頭
- 發(fā)現(xiàn)服務(wù)器返回錯(cuò)誤
org.xml.sax.SAXParseException: The element type "hr" must be terminated by the matching end-tag "</hr>"
矛盾點(diǎn)
- 單純分析錯(cuò)誤發(fā)現(xiàn)是由于
標(biāo)簽沒(méi)有閉合造成的異常骂束,那么正常思路就是去找找服務(wù)器中哪里發(fā)送了這個(gè)html殃饿。所以我到服務(wù)器全局搜索
這個(gè)標(biāo)簽都沒(méi)有找到官辈。完全沒(méi)了解決思路。 - 我們?cè)诰帉?xiě)html文件的時(shí)候明明
是可以沒(méi)有</hr>的鬼譬,為什么在這里會(huì)拋出異常?
是什么SAXParseException異常?
-
SAX知識(shí)補(bǔ)充:
- SAX(simple api for xml):是一種XML解析的替代方法
- SAX相比于DOM放接,是一種速度更快,更有效的解析XML文件的方式
- 原理:它逐行掃描文檔留特,一邊掃描一邊解析纠脾,可以在解析文檔的任意時(shí)刻停止解析。
總結(jié):由上可以知道SAX專(zhuān)門(mén)用來(lái)解析XML文件蜕青,并且邊掃描邊解析苟蹈。服務(wù)器解析xml的時(shí)候,解析到
然后發(fā)現(xiàn)有問(wèn)題然后拋出異常右核。 -
get到的非技術(shù)相關(guān):
- 看到一個(gè)異常被拋出:
- 為什么拋出異常(其實(shí)就是異常message)
- 這是什么異常(可以幫助你更多的了解上下文)
- 什么拋出的(上一個(gè)問(wèn)題基本可以幫助你定位)
- 但是其實(shí)光看message有時(shí)候是可以定位錯(cuò)誤的
- 看到一個(gè)異常被拋出:
-
這個(gè)時(shí)候可以解釋矛盾點(diǎn)二:
- 首先在html中
<hr>
可以不閉合 - 但是我們這是xml文件
- 首先在html中
XML和HTML的區(qū)別又是啥
-
- XML:可擴(kuò)展標(biāo)記語(yǔ)言
- HTML: 超文本標(biāo)記語(yǔ)言
- 相同點(diǎn):
- 都是標(biāo)記語(yǔ)言慧脱,用于數(shù)據(jù)的保存和傳輸
- 不同
- 雖然都是跨平臺(tái)標(biāo)記語(yǔ)言:
- xml:很多的編程語(yǔ)言都可以讀取其中數(shù)據(jù)(由于很多語(yǔ)言都內(nèi)置了xml解析器)
- html:不同瀏覽器都可以解析html語(yǔ)言,并且將他顯示出來(lái)贺喝。
- 服務(wù)對(duì)象:
- xml:主要用于數(shù)據(jù)存儲(chǔ)菱鸥,重點(diǎn)在于數(shù)據(jù)能夠被讀取識(shí)別宗兼,因此是數(shù)據(jù)傳輸?shù)囊环N很好的格式。但是不用于顯示氮采,瀏覽器無(wú)法識(shí)別殷绍。
- html:相當(dāng)于一種標(biāo)準(zhǔn),定義了一堆標(biāo)簽重點(diǎn)在于顯示鹊漠,不在于數(shù)據(jù)篡帕。
- 自定義標(biāo)簽:
- xml:可以自定義標(biāo)簽擴(kuò)展性好
- html:由于是一種w3c標(biāo)準(zhǔn)。為了任何瀏覽器都可以識(shí)別標(biāo)簽贸呢,絕對(duì)不可以自定義镰烧,因此擴(kuò)展性差。
- 語(yǔ)法
- xml:嚴(yán)格要求嵌套楞陷、配對(duì)怔鳖,并遵循DTD的樹(shù)形結(jié)構(gòu);區(qū)分大小寫(xiě)固蛾;屬性值必須分裝在引號(hào)中结执;所有的屬性都必須帶有相應(yīng)的值;空白部分不會(huì)被解析器自動(dòng)刪除艾凯;xml比html 語(yǔ)法要求更嚴(yán)格
- html:不要求標(biāo)記的嵌套献幔、配對(duì)等;不區(qū)分大小寫(xiě)引號(hào)是可用可不用的趾诗;可以擁有不帶值的屬性名蜡感;過(guò)濾掉空格;
- 雖然都是跨平臺(tái)標(biāo)記語(yǔ)言:
-----> 結(jié)論:其實(shí)最大的差距在于用途不一致:html主要的用途就是在瀏覽器顯示focus在如何顯示出數(shù)據(jù)恃泪。而xml主要在于數(shù)據(jù)的傳輸郑兴,focus在如何更加方便各種語(yǔ)言閱讀數(shù)據(jù)。
-----> 和問(wèn)題相關(guān)的結(jié)論:xml的語(yǔ)法要求嚴(yán)格因此對(duì)于html中可以不封閉的
標(biāo)簽在xml中會(huì)報(bào)錯(cuò)贝乎。response中HEADER的accept可以是XML也可以是HTML情连。因此可以大膽猜測(cè):服務(wù)器以為自己(約定)收到的是XML的response,因此使用xml解析器去解析览效,但是實(shí)際發(fā)送過(guò)來(lái)的卻是html却舀。因此gateway的response出錯(cuò)----> 類(lèi)比:其實(shí)這個(gè)問(wèn)題類(lèi)似于我曾經(jīng)在瀏覽器中看到過(guò)不能找到
<
這樣的錯(cuò)誤。就是由于HEADER中的Accept告訴瀏覽器發(fā)送過(guò)來(lái)的是一個(gè)html文件锤灿,但是實(shí)際發(fā)過(guò)來(lái)的可能是js文件因此一定不是<
開(kāi)頭
到底是哪里來(lái)的html里面帶了
挽拔?
- 首先判斷這肯定是錯(cuò)誤情況出現(xiàn)的,所以可以看看錯(cuò)誤的請(qǐng)求能得到什么response衡招。這里我還是求助了老師篱昔,發(fā)現(xiàn)當(dāng)我請(qǐng)求了一個(gè)錯(cuò)誤的路徑,nginx會(huì)返回404not found其中的response是
<html>
<head><title>404 Not Found</title></head>
<body bgcolor="white">
<center><h1>404 Not Found</h1></center>
<hr>
<center>nginx/1.10.3</center>
</body>
</html>`
恰巧有hr始腾。
- 因此錯(cuò)誤可以這樣理解州刽,gateway服務(wù)器請(qǐng)求某個(gè)錯(cuò)誤的url,nginx由于沒(méi)有資源返回了404 html浪箭,但是gateway本來(lái)應(yīng)該約定收到xml穗椅,因此出錯(cuò)。
使用錯(cuò)誤的協(xié)議發(fā)請(qǐng)求
- 例子:url使用http發(fā)送請(qǐng)求到https服務(wù)器一定會(huì)導(dǎo)致請(qǐng)求failed而且什么內(nèi)容都拿不到奶栖。
- 如何避免:看清楚你服務(wù)器啟動(dòng)時(shí)候的log信息:他會(huì)給你打悠ケ怼:
- 端口號(hào)
- 協(xié)議類(lèi)型
反思
- 當(dāng)看到服務(wù)器拋出異常沒(méi)有一種冷靜邏輯的分析思路,思維發(fā)散宣鄙。試一下試不出來(lái)就換方法袍镀。簡(jiǎn)單的說(shuō)還是在碰運(yùn)氣。
action
- 以后看到問(wèn)題冻晤,需要先構(gòu)思解決思路苇羡。告訴自己首先應(yīng)該干什么如果。鼻弧。然后怎么樣设江。。必須有思路攘轩,并且問(wèn)題解決完畢必須說(shuō)明為什么出現(xiàn)這個(gè)問(wèn)題叉存。