zoukankan      html  css  js  c++  java
  • HTTP 协议报文解析

    说明

    本篇主要是为了记录HTTP中报文的格式,以便针对报文进行解析。首先会介绍基础的HTTP报文,之后会介绍
    文件上传时的数据报文格式.

    HTTP基础报文格式

    按照HTTP报文类型进行介绍,HTTP报文类型分为请求报文(客户端主动请求报文)和响应报文(服务端响应客户端的回传报文)。其基本的格式为:

    GET / HTTP/1.1
    Host: www.enjoytoday.cn
    Connection: keep-alive
    Upgrade-Insecure-Requests: 1
    User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.84 Safari/537.36
    Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
    Referer: http://www.enjoytoday.cn/posts/326
    Accept-Encoding: gzip, deflate, sdch
    Accept-Language: zh-CN,zh;q=0.8
    Cookie: bdshare_firstime=1466032270994; UM_distinctid=15c4ef2ac4e2e4-0d13269271b947-1b2a120b-1fa400-15c4ef2ac4f7b5; un=aGZjYWk=; comment_author=aGZjYWk=; comment_author_email=1710600212@qq.com; comment_author_url=http://www.enjoytoday.cn; c_id=dUhIaTlndmc4MVVYbjRQTGxMRTotMTpFODg3QjgzQjg1NjgxQjQxRUYxNjg2QzJFRkMyQjI2QQ==; JSESSIONID=ADBC8C3DADF6C815D778450C193C6637.ajp13_worker; Hm_lvt_ce55bfda158556585a8b7b246346c8ba=1498560244,1498739070,1498833193,1498917432; Hm_lpvt_ce55bfda158556585a8b7b246346c8ba=1498917597; CNZZDATA1262047894=1598545996-1495973145-%7C1498917578
    
    username=hfcai&sex=man

    1) 请求报文

    请求报文数据格式由三个部分组成:

    • 请求方法、URI、HTTP协议版本

      该部分位于数据首行,基本格式为:

      GET /index.html HTTP/1.1

      该部分给出了请求类型和请求的资源位置(/index.html),其中HTTP中的请求类型包括:GET、POST、HEAD、PUT、DELETE.一般常用的为POST和GET方式。

    • 请求头部

      该部分紧跟着上一部分(方法、协议版本行),该部分主要是用于描述请求正文,其基本格式如下:

      Host: www.enjoytoday.cn
      Connection: keep-alive
      Upgrade-Insecure-Requests: 1
      User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.84 Safari/537.36
      ......

      主要是用于说明请求源、连接类型、以及一些Cookie信息等。

    • 请求正文

      请求正文和请求头部通过一个空行进行隔开,一般用于存放POST请求类型的请求正文,如上的请求体为:

      username=hfcai&sex=man

    2)响应报文

    响应报文和请求报文格式类型,同样也是分为三个部分,响应头部和响应体同样也是通过一个空行进行隔开,如下为一个简单的示例:

    HTTP/1.1 200 OK
      Date: Sat, 01 Jul 2017 14:51:26 GMT
      Server: Apache/2.4.7 (Ubuntu)
      Set-Cookie: JSESSIONID=84C993F5E433C4DE9BFBA57150FFC065.ajp13_worker;path=/;HttpOnly
      Content-Language: zh-CN
      Vary: Accept-Encoding
      Content-Encoding: gzip
      Content-Length: 7333
      Keep-Alive: timeout=5, max=100
      Connection: Keep-Alive
      Content-Type: text/html;charset=UTF-8
    
      <html>
      <head>
      <title>title of html.</html>
      </head>
      <body>
      <h1>Hello world!</h1>
      </body>
      </html>
    • 状态码部分

      该部分主要给出响应HTTP协议版本号、响应返回状态码、响应描述,同样是单行显示.格式为:

      HTTP/1.1 200 OK

      响应返回一般由一个三位数组成,分别以整数1~5开头组成。各个类型响应对应含义:

      • 1XX:信息提示,临时的响应
      • 2XX:请求成功,服务端已经接受到请求信息
      • 3XX:重定位
      • 4XX:客户端异常
      • 5XX:服务端异常
        常见的响应有:200(响应成功),400(请求异常,一般为参数异常),404(请求资源不存在),405(请求方式不支持),500(服务器内部异常)
    • 响应头部

      响应头部主要是返回一些服务器的基本信息,以及一些Cookie值等。如上的响应头为:

      Date: Sat, 01 Jul 2017 14:51:26 GMT
      Server: Apache/2.4.7 (Ubuntu)
      Set-Cookie: JSESSIONID=84C993F5E433C4DE9BFBA57150FFC065.ajp13_worker;path=/;HttpOnly
      Content-Language: zh-CN
      Vary: Accept-Encoding
      Content-Encoding: gzip
      Content-Length: 7333
      Keep-Alive: timeout=5, max=100
      Connection: Keep-Alive
      Content-Type: text/html;charset=UTF-8
    • 响应体

      该部分为请求需要得到的具体数据,可以为任何类型数据,一般网页浏览返回的为html文件内容.如上,内容不再列出。同样,和响应头部通过一个空行进行隔开。

    文件上传报文格式

    如下,介绍通过浏览器上传文件时它的报文格式和一般的报文的异同。文件上传主要在于文件上传时的格式差异,如下给出一个示例的格式:

    POST /servlet/UploadServlet HTTP/1.1
    Host: localhost:8080
    Connection: keep-alive
    Content-Length: 349
    Cache-Control: max-age=0
    Origin: http://localhost:8080
    Upgrade-Insecure-Requests: 1
    User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.84 Safari/537.36
    Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryy4ceMstxB6tXIWBT
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
    Referer: http://localhost:8080/hello.html
    Accept-Encoding: gzip, deflate
    Accept-Language: zh-CN,zh;q=0.8
    Cookie: comment_author="aGZjYWk="; comment_author_email="1710600212@qq.com"; comment_author_url="http://localhost:8080"; UM_distinctid=15c4ef587620-0ad25ac342d545-1b2a120b-1fa400-15c4ef58763717; CNZZDATA1262047894=628334530-1495973332-%7C1495973678; Hm_lvt_ce55bfda158556585a8b7b246346c8ba=1495973333
    
    ------WebKitFormBoundaryy4ceMstxB6tXIWBT
    Content-Disposition: form-data; name="filedata"; filename="test.txt"
    Content-Type: text/plain
    
    This is the upload file
    this is a test file
    this is a text file
    
    ------WebKitFormBoundaryy4ceMstxB6tXIWBT
    Content-Disposition: form-data; name="submit"
    
    upload
    ------WebKitFormBoundaryy4ceMstxB6tXIWBT--
    

    如上,我上传了一个测试文件(test.txt),其文件内容为:

    This is the upload file
    this is a test file
    this is a text file
    

    其基本格式还是遵循HTTP的请求格式,但对于正文部分添加了一些对于上传文件的说明,格式如下:

    POST /servlet/UploadServlet HTTP/1.1    #请求uri、方法
    Host: localhost:8080Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryy4ceMstxB6tXIWBT    #边界值
    ......
    Accept-Language: zh-CN,zh;q=0.8
    
    ------WebKitFormBoundaryy4ceMstxB6tXIWBT                   #边界
    Content-Disposition: form-data;name="filedata";filename="test.txt" #文件基本信息
    Content-Type: text/plain                              #文件基本信息           
    
    This is the upload file                               #文件内容    
    this is a test file
    this is a text file
    
    ------WebKitFormBoundaryy4ceMstxB6tXIWBT       #提交按钮属性信息部分
    Content-Disposition: form-data; name="submit"
    
    upload                                        #提交按钮value值                
    ------WebKitFormBoundaryy4ceMstxB6tXIWBT--
    
    

    其他部分和一般的HTTP数据格式一样(包括响应数据的格式)。

    Enjoytoday,Enjoycoding

  • 相关阅读:
    一个自动打补丁的脱机程序
    OPC 学习交流感想
    串口标准,说说流控制(RTS/CTS/DTR/DSR 你都明白了吗?)
    asp.net中调用COM组件发布IIS时常见错误 80070005解决方案
    可运行XP的最少后台服务配置
    MapGIS 7.0 SP2 企业版 & MapGIS 7.1IMS
    简单认识一下S60系统
    常用正则表达式
    图像处理:遮罩
    office2003中WORD中visio图无法打印中文问题解决方法
  • 原文地址:https://www.cnblogs.com/amiko/p/7906221.html
Copyright © 2011-2022 走看看