HTTP中的Content-Type

MIME

在介绍Content-Type之前,先介绍一下MIME。
早期的互联网时代,网页都很简单,大部分都是文字内容。随着互联网的发展,传递的信息越来越丰富,如图片、声音、视频等。计算机都是传递的二进制文件,那他是怎么知道哪些是图片文件,哪些是声音文件?
很简单,我们直接告诉接受方“喂,这是声音文件,你用声音文件的程序打开”;“这是视频文件…”。
这样接受文件的那一方就知道怎么打开文件了。

MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展,它是一个互联网标准,在1992年最早应用于电子邮件系统,但后来也应用到浏览器。服务器会将它们发送的多媒体数据的类型告诉浏览器,而通知手段就是说明该多媒体数据的MIME类型,从而让浏览器知道接收到的信息哪些是MP3文件,哪些是Shockwave文件等等。服务器将MIME标志符放入传送的数据中来告诉浏览器使用哪种插件读取相关文件。

文件的扩展名决定了文件是什么样的MIME类型。
每个MIME类型由两部分组成,前面是数据的大类别,例如声音audio、图象image等,后面定义具体的种类。

文件扩展名MIME
超文本标记语言文本.htmltext/html
普通文本.txttext/plain
PNG图像.pngimage/png
TAR文件.tarapplication/x-tar
json文件.jsonapplication/json




Content-Type

在http中,MIME被定义在了Content-Type中。若服务器返回的是html文档,就在响应头中定义Content-Type: text/html。若服务器返回的是jpeg,则Content-Type: image/jpeg。



表单的提交

在Form元素的语法中,EncType表明提交数据的格式 用 Enctype 属性指定将数据回发到服务器时浏览器使用的编码类型。 例如:

  • application/x-www-form-urlencoded: 窗体数据被编码为名称/值对。这是标准的编码格式。
  • multipart/form-data: 窗体数据被编码为一条消息,页上的每个控件对应消息中的一个部分,这个一般文件上传时用。
  • text/plain: 窗体数据以纯文本形式进行编码,其中不含任何控件或格式字符。

form表单默认为application/x-www-form-urlencoded,数据被编码为key/value格式发送到服务器。

当action为get时候,浏览器用x-www-form-urlencoded的编码方式把form数据转换成一个字串(name1=value1&name2=value2…),然后把这个字串append到url后面,用?分割,加载这个新的url。
当action为post时候,浏览器把form数据封装到http body中,然后发送到server。



在使用ajax发送请求时,需要我们自己设置content-type,否则默认为text/plain。
这也是为什么ajax的用post请求必须设置如下代码:

ajax.setRequestHeader("content-type","application/x-www-form-urlencoded");

注意:上面的代码必须设置在open和send方法之间
ajax的get方式本来就要将参数以键值对的形式添加到url后面,这和表单的get方法提交一样,但ajax的post方式若以默认的content-type(text/plain),则会出现问题。
我们用PHP的print_r($_POST)来接受不同content-type值时传递的内容

<!DOCTYPE html>
<html>
<head>
    <title></title>
</head>
<body>
    <button id="btn">button</button>
    <p id="display"></p>
<script type="text/javascript">
document.getElementById('btn').onclick=function(){
    var XHR=new XMLHttpRequest();
    XHR.open("post","09.php");
    // XHR.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
    XHR.send("name=zzh&age=21");
    XHR.onreadystatechange=function(){
        if (XHR.readyState==4&&XHR.status==200) {   
                          document.getElementById('display').innerHTML=XHR.responseText;
        }
    }
}
</script>
</body>
</html>
<?php
print_r($_POST);

当我们直接post字符串 “name=zzh&age=21”时,打印出array()
打开调试工具可以看到
这里写图片描述
Content-Type为text/plain,也就说你post的什么它就传递什么。之所以PHP打印出空数组是因为$_POST是保存的是form提交的数据,这里提交的字符串不是form提交的数据。

当我们设置content-type:application/x-www-form-urlencoded时
打印出 Array ( [name] => zzh [age] => 21 )
这里写图片描述
application/x-www-form-urlencoded会使数据被编码为名称/值对。
且以表单数据提交,所以能打印。


以上就是我自己对content-type的理解,若有错误欢迎指出!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值