zoukankan      html  css  js  c++  java
  • 【HTTP】另类的POST头数据 RFC1867协议格式简析

    http://blog.csdn.net/ai2000ai/article/details/52161979

    昨天在实战表单模拟提交的时候,有发现在提交某个表单的时候,页面(discuz!论坛)报错,无法检测到数据来源云云,但是我确实提交了http_referer了啊,怎么会出现这个情况呢?问了下haohappy,他给了个pear的类,http/client,才发现,我研究了几天的东东,原来有个现成的可以用,“使用pear站在巨人的肩膀上”,这个果然没有错。过些天组装一个client试试看。
     
    又扯远了,书归正传,说研究一下一个另类的post头,为什么说另类呢,因为一般的post头的
    Content-Type: application/x-www-form-urlencoded
    而他的是
    Content-Type: multipart/form-data; boundary=-------7d71f4234700b8
     
    那么两者的区别又在那里呢?
     
    1、做过表单html的coder都知道,在需要有上传文件操作的时候,表单的类型必须是enctype="multipart/form-data",那么这里也就这个原因,究其根源,可以追溯到RFC1867协议,这个协议主要是在HTTP协议的基础上为INPUT标签增加了file属性,同时限定了Form的method必须为POST,ENCTYPE必须为multipart/form-data。
     
    2、后者增加了boundary,所谓的boundary其实就是分割线,RFC1867利用boundary分割HTTP实体数据。boundary中数字字符区是随机生成的。
     
    3、对HTTP实体的变更

    因为RFC1867增加了文件上传的功能,而上传文件内容自然也会被加入到HTTP的实体中。现在因为既有HTTP一般的参数实体,又有上传文件的实体,所以用boundary把每种实体进行了分割,HTTP的实体看起来将是类似下面的样子:  

    -----------------------------7d71f4234700b8
    Content-Disposition: form-data; name="formhash"


    59329e15
    -----------------------------7d71f4234700b8
    Content-Disposition: form-data; name="isblog"




    -----------------------------7d71f4234700b8
    Content-Disposition: form-data; name="fid"


    104
    -----------------------------7d71f4234700b8
    Content-Disposition: form-data; name="subject"


    test
    -----------------------------7d71f4234700b8
    Content-Disposition: form-data; name="iconid"


    0
    -----------------------------7d71f4234700b8
    Content-Disposition: form-data; name="usesig"


    1
    -----------------------------7d71f4234700b8
    Content-Disposition: form-data; name="message"


    test
    -----------------------------7d71f4234700b8
    Content-Disposition: form-data; name="attachperm[]"


    0
    -----------------------------7d71f4234700b8
    Content-Disposition: form-data; name="attachdesc[]"




    -----------------------------7d71f4234700b8
    Content-Disposition: form-data; name="attach[]"; filename=""
    Content-Type: application/octet-stream




    -----------------------------7d71f4234700b8
    Content-Disposition: form-data; name="attachperm[]"


    0
    -----------------------------7d71f4234700b8
    Content-Disposition: form-data; name="attachdesc[]"




    -----------------------------7d71f4234700b8
    Content-Disposition: form-data; name="attach[]"; filename=""
    Content-Type: application/octet-stream




    -----------------------------7d71f4234700b8
    Content-Disposition: form-data; name="wysiwyg"


    1
    -----------------------------7d71f4234700b8--

    很明显,增加了文件上传后,HTTP实体变得稍微复杂了,首先是通过boundary把实体分开,以便于读取,然后对FileUpload的格式也作了限制。

    4、那么同样,这种格式也是需要提供Content-Length属性的,那么和简单的post数据头相比较,就可以发现,变化的地方有:

    ......

    Content-Type:

    ......
    Content-Length:

    ......

    数据体 goes here~

    注意到这几个地方的变化后,就可以像往常一样post了

  • 相关阅读:
    Mysql实战面试题
    初探Google Guava
    Spring IOC核心源码学习
    用3句话像老太太讲清楚什么是数据库
    matlab如何读入mat型的矩阵
    工作记忆数据处理
    功能连接
    奖励学习
    格兰杰因果关系及其在医学影像数据中的应用
    GC wm
  • 原文地址:https://www.cnblogs.com/feng9exe/p/7058652.html
Copyright © 2011-2022 走看看