zoukankan      html  css  js  c++  java
  • Content-Type

     常见的媒体格式类型如下:

    •     text/html : HTML格式
    •     text/plain :纯文本格式      
    •     text/xml :  XML格式
    •     image/gif :gif图片格式    
    •     image/jpeg :jpg图片格式 
    •     image/png:png图片格式

       以application开头的媒体格式类型:

    •    application/xhtml+xml :XHTML格式
    •    application/xml     : XML数据格式
    •    application/atom+xml  :Atom XML聚合格式    
    •    application/json    : JSON数据格式
    •    application/pdf       :pdf格式  
    •    application/msword  : Word文档格式
    •    application/octet-stream : 二进制流数据(如常见的文件下载)
    •    application/x-www-form-urlencoded : <form encType=””>中默认的encType,form表单数据被编码为key/value格式发送到服务器(表单默认的提交数据的格式)

       另外一种常见的媒体格式是上传文件之时使用的:

    •     multipart/form-data : 需要在表单中进行文件上传时,就需要使用该格式

    0x03.application/x-www-form-urlencoded

    application/x-www-form-urlencoded是常用的表单发包方式,普通的表单提交,或者js发包,默认都是通过这种方式,

    比如一个简单地表单:

    <form enctype="application/x-www-form-urlencoded" action="http://homeway.me/post.php" method="POST">
        <input type="text" name="name" value="homeway">
        <input type="text" name="key" value="nokey">
        <input type="submit" value="submit">
    </form>
    

    那么服务器收到的raw header会类似:

    Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
    Accept-Encoding:gzip, deflate
    Accept-Language:zh-CN,zh;q=0.8,en;q=0.6,zh-TW;q=0.4,gl;q=0.2,de;q=0.2
    Cache-Control:no-cache
    Connection:keep-alive
    Content-Length:17
    Content-Type:application/x-www-form-urlencoded
    

    那么服务器收到的raw body会是,name=homeway&key=nokey,在php中,通过$_POST就可以获得数组形式的数据。


    0x04.multipart/form-data

    multipart/form-data用在发送文件的POST包。

    这里假设我用python的request发送一个文件给服务器:

    data = {
        "key1": "123",
        "key2": "456",
    }
    files = {'file': open('index.py', 'rb')}
    res = requests.post(url="http://localhost/upload", method="POST", data=data, files=files)
    print res
    

    通过工具,可以看到我发送的数据内容如下:

    POST http://www.homeway.me HTTP/1.1
    Content-Type:multipart/form-data; boundary=------WebKitFormBoundaryOGkWPJsSaJCPWjZP
    
    ------WebKitFormBoundaryOGkWPJsSaJCPWjZP
    Content-Disposition: form-data; name="key2"
    456
    ------WebKitFormBoundaryOGkWPJsSaJCPWjZP
    Content-Disposition: form-data; name="key1"
    123
    ------WebKitFormBoundaryOGkWPJsSaJCPWjZP
    Content-Disposition: form-data; name="file"; filename="index.py"
    

    这里Content-Type告诉我们,发包是以multipart/form-data格式来传输,另外,还有boundary用于分割数据。

    当文件太长,HTTP无法在一个包之内发送完毕,就需要分割数据,分割成一个一个chunk发送给服务端,

    那么--用于区分数据快,而后面的数据633e61ebf351484f9124d63ce76d8469就是标示区分包作用。


    0x05.text/xml

    微信用的是这种数据格式发送请求的。

    POST http://www.homeway.me HTTP/1.1 
    Content-Type: text/xml
    
    <?xml version="1.0"?>
    <resource>
        <id>123</id>
        <params>
            <name>
                <value>homeway</value>
            </name>
            <age>
                <value>22</value>
            </age>
        </params>
    </resource>
    

    php中$_POST只能读取application/x-www-form-urlencoded数据,$_FILES只能读取multipart/form-data类型数据,

    那么,要读取text/xml格式的数据,可以用:

    $file = fopen('php://input', 'rb');
    $data = fread($file, length);
    fclose($file);

    或者

    $data = file_get_contents('php://input');


    0x06.application/json

    通过json形式将数据发送给服务器,一开始,我尝试通过curl,给服务器发送application/json格式包,

    然而我收到的数据如下:

    --------------------------e1e1406176ee348a Content-Disposition: form-data; name="nid" 2 --------------------------e1e1406176ee348a Content-Disposition: form-data; name="uuid" cf9dc994-a4e7-3ad6-bc54-41965b2a0dd7 --------------------------e1e1406176ee348a Content-Disposition: form-data; name="access_token" 956731586df41229dbfec08dd5d54eedb98d73d2 --------------------------e1e1406176ee348a--

    后来想想明白了,HTTP通信中并不存在所谓的json,而是将string转成json罢了,也就是,application/json可以将它理解为text/plain,普通字符串。

    之所以出现那么多乱七八糟的-------应该是php数组传输进去,存在的转换问题吧(我目前能想到的原因)。

    本文出自 夏日小草,转载请注明出处:http://homeway.me/2015/07/19/understand-http-about-content-type/

    -by小草

  • 相关阅读:
    dedecms为导航栏目添加英文标题
    网页设计中一些小功能
    less使用总结
    canvas图形库
    前端面试总结三
    前端面试总结二
    DOM节点中获取文本易混淆的属性
    前端面试总结
    git 学习使用总结三(远程仓库操作)
    git 学习使用总结二(远程仓库操作)
  • 原文地址:https://www.cnblogs.com/sysnap/p/7028249.html
Copyright © 2011-2022 走看看