美文网首页
问题:使用不对的http协议发送请求

问题:使用不对的http协议发送请求

作者: 张培_ | 来源:发表于2017-11-05 17:48 被阅读20次

    情景描述

    • 使用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文件

    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

    • 以后看到问题,需要先构思解决思路。告诉自己首先应该干什么如果。。然后怎么样。。必须有思路,并且问题解决完毕必须说明为什么出现这个问题。

    相关文章

      网友评论

          本文标题:问题:使用不对的http协议发送请求

          本文链接:https://www.haomeiwen.com/subject/aznnextx.html