情景描述
- 使用nginx反向代理服务器
- 服务器支持https协议
- 发送请求的时候将url写成了http开头
- 发现服务器返回错误
org.xml.sax.SAXParseException: The element type "hr" must be terminated by the matching end-tag "</hr>"
矛盾点
- 单纯分析错误发现是由于
标签没有闭合造成的异常,那么正常思路就是去找找服务器中哪里发送了这个html。所以我到服务器全局搜索
这个标签都没有找到。完全没了解决思路。 - 我们在编写html文件的时候明明
是可以没有</hr>的,为什么在这里会抛出异常?
是什么SAXParseException异常?
-
SAX知识补充:
- SAX(simple api for xml):是一种XML解析的替代方法
- SAX相比于DOM,是一种速度更快,更有效的解析XML文件的方式
- 原理:它逐行扫描文档,一边扫描一边解析,可以在解析文档的任意时刻停止解析。
总结:由上可以知道SAX专门用来解析XML文件,并且边扫描边解析。服务器解析xml的时候,解析到
然后发现有问题然后抛出异常。 -
get到的非技术相关:
- 看到一个异常被抛出:
- 为什么抛出异常(其实就是异常message)
- 这是什么异常(可以帮助你更多的了解上下文)
- 什么抛出的(上一个问题基本可以帮助你定位)
- 但是其实光看message有时候是可以定位错误的
- 看到一个异常被抛出:
-
这个时候可以解释矛盾点二:
- 首先在html中
<hr>
可以不闭合 - 但是我们这是xml文件
- 首先在html中
XML和HTML的区别又是啥
-
- XML:可扩展标记语言
- HTML: 超文本标记语言
- 相同点:
- 都是标记语言,用于数据的保存和传输
- 不同
- 虽然都是跨平台标记语言:
- xml:很多的编程语言都可以读取其中数据(由于很多语言都内置了xml解析器)
- html:不同浏览器都可以解析html语言,并且将他显示出来。
- 服务对象:
- xml:主要用于数据存储,重点在于数据能够被读取识别,因此是数据传输的一种很好的格式。但是不用于显示,浏览器无法识别。
- html:相当于一种标准,定义了一堆标签重点在于显示,不在于数据。
- 自定义标签:
- xml:可以自定义标签扩展性好
- html:由于是一种w3c标准。为了任何浏览器都可以识别标签,绝对不可以自定义,因此扩展性差。
- 语法
- xml:严格要求嵌套、配对,并遵循DTD的树形结构;区分大小写;属性值必须分装在引号中;所有的属性都必须带有相应的值;空白部分不会被解析器自动删除;xml比html 语法要求更严格
- html:不要求标记的嵌套、配对等;不区分大小写引号是可用可不用的;可以拥有不带值的属性名;过滤掉空格;
- 虽然都是跨平台标记语言:
-
-----> 结论:其实最大的差距在于用途不一致:html主要的用途就是在浏览器显示focus在如何显示出数据。而xml主要在于数据的传输,focus在如何更加方便各种语言阅读数据。
-
-----> 和问题相关的结论:xml的语法要求严格因此对于html中可以不封闭的
标签在xml中会报错。response中HEADER的accept可以是XML也可以是HTML。因此可以大胆猜测:服务器以为自己(约定)收到的是XML的response,因此使用xml解析器去解析,但是实际发送过来的却是html。因此gateway的response出错 -
----> 类比:其实这个问题类似于我曾经在浏览器中看到过不能找到
<
这样的错误。就是由于HEADER中的Accept告诉浏览器发送过来的是一个html文件,但是实际发过来的可能是js文件因此一定不是<
开头
到底是哪里来的html里面带了
?
- 首先判断这肯定是错误情况出现的,所以可以看看错误的请求能得到什么response。这里我还是求助了老师,发现当我请求了一个错误的路径,nginx会返回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。
- 因此错误可以这样理解,gateway服务器请求某个错误的url,nginx由于没有资源返回了404 html,但是gateway本来应该约定收到xml,因此出错。
使用错误的协议发请求
- 例子:url使用http发送请求到https服务器一定会导致请求failed而且什么内容都拿不到。
- 如何避免:看清楚你服务器启动时候的log信息:他会给你打印:
- 端口号
- 协议类型
反思
- 当看到服务器抛出异常没有一种冷静逻辑的分析思路,思维发散。试一下试不出来就换方法。简单的说还是在碰运气。
action
- 以后看到问题,需要先构思解决思路。告诉自己首先应该干什么如果。。然后怎么样。。必须有思路,并且问题解决完毕必须说明为什么出现这个问题。
网友评论