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

  • 相关阅读:
    Binary Search Tree Iterator 解答
    Invert Binary Tree 解答
    Min Stack 解答
    Trapping Raining Water 解答
    Candy 解答
    Jump Game II 解答
    Implement Hash Map Using Primitive Types
    Gas Station 解答
    Bucket Sort
    HashMap 专题
  • 原文地址:https://www.cnblogs.com/amiko/p/7906221.html
Copyright © 2011-2022 走看看