Content-Type简析

目录

一:Content-Type

二:常用的类型

2.1 multipart/form-data

2.2 application/x-www-form-urlencoded

2.3 application/json

2.4 text/xml

三:补充说明

3.1.application/octet-stream

3.2.multipart/form-data和application/x-www-form-urlencoded的区别

四:Content-Type设置建议


一:Content-Type

       Content-Type,内容类型,一般是指网页中存在的Content-Type,用于定义网络文件的类型和网页的编码。在HTTP协议消息头中,使用Content-Type来表示请求和响应中的媒体类型信息。它用来告诉服务端如何处理请求的数据,以决定浏览器将以什么形式、什么编码读取这个文件,这就是经常看到一些Asp网页点击的结果却是下载到的一个文件或一张图片的原因。

下面是几个常见的Content-Type:

1.text/html
2.text/plain
3.text/css
4.text/javascript
5.application/x-www-form-urlencoded
6.multipart/form-data
7.application/json
8.application/xml
... 


二:常用的类型

2.1 multipart/form-data

上图的form-data就是指的multipart/form-data
这是一个多部分多媒体类型,它是一个常见的 POST 数据提交的方式,它会生成了一个 boundary 用于分割不同的字段。它会将表单的数据处理为一条消息,以标签为单元,用分隔符分开。既可以上传键值对,也可以上传文件。当上传的字段是文件时,会有Content-Type来说明文件类型。
注意,当使用表单上传文件时,必须让 form 的 enctype 等于这个值。

<form action="/" method="post" enctype="multipart/form-data">
  <input type="text" name="username">
  <button type="submit">Submit</button>
</form>

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发送给服务端,

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

 

2.2 application/x-www-form-urlencoded

       上图的x-www-form-urlencoded就是指的application/x-www-form-urlencoded,

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

       一般用于表单提交,会将请求参数用key1=val1&key2=val2的方式进行组织和编码,key 和 val 都进行了 URL 转码,并放到请求实体里面(注意如果是中文或特殊字符如"/"、","、“:" 等会自动进行URL转码)。

比如一个简单地表单:

<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就可以获得数组形式的数据。

 

2.3 application/json

     最常用的。使用这个类型,提交的是序列化后的 JSON 字符串,服务端/客户端会按json格式解析数据

上图的的raw,表示可上传任意格式的文本,可以上传text、json、xml、html等各种文本类型,一般用来选择application/json传入json格式的参数。

private static String postJson(String urlStr, String json) throws IOException {
        URL url = new URL(urlStr);
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setConnectTimeout(8000);
        conn.setReadTimeout(8000);
        conn.setRequestMethod("POST");
        conn.setRequestProperty("Content-Type","application/json");
        conn.setDoOutput(true);
        conn.setDoInput(true);
        conn.getOutputStream().write(json.getBytes());

        if(conn.getResponseCode() == 200) {
            BufferedReader
                reader = new BufferedReader(new InputStreamReader(conn.getInputStream(), "utf-8"));
            StringBuilder response = new StringBuilder();
            String line;
            while ((line = reader.readLine()) != null) {
                response.append(line);
            }
            return response.toString();
        }
        return null;
    }

2.4 text/xml

即传递XML格式,在以前比较常用,不接触老的项目应该用不到。


三:补充说明

3.1.application/octet-stream

上图binary指的是application/octet-stream
Content-Type为application/octet-stream时,只可上传二进制数据,通常用来上传文件,没有键值,一次只能上传一个文件。

3.2.multipart/form-data和application/x-www-form-urlencoded的区别

  • multipart/form-data:既可以上传文件等二进制数据,也可以上传表单键值对,只是最后会转化为一条信息。
  • application/x-www-form-urlencoded:只能上传键值对,且键值对都是间隔分开。

四:Content-Type设置建议

  1. restful接口(json格式),一般将Content-Type设置为application/json; charset=UTF-8
  2. 文件上传,Content-Type设置为multipart/form-data
  3. 普通表单提交,Content-Type设置为application/x-www-form-urlencoded


 

参考文章:

https://www.jianshu.com/p/46fec81809df

https://www.jianshu.com/p/bca3d5cca8a2

 

 

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

许进进

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值