从http协议,form表单,ajax,httpclient角度解释Content-Type的设置
百度解释:
Content-Type,内容类型,一般是指网页中存在的Content-Type,用于定义网络文件的类型和网页的编码,决定文件接收方将以什么形式、什么编码读取这个文件,这就是经常看到一些Asp网页点击的结果却是下载到的一个文件或一张图片的原因。
常见Content-Type的值:
1,application/x-www-form-urlencoded(默认值,又名url编码方式),
编码方式:
是使用&拼接传递的key(参数名)=value(参数值),如name=zhangsan&age=18 ,对于中文url编码的数据都是以“%”为前缀,后面跟随两位的16进制,例如“传智”这两个字使用UTF-8的url编码用为“%E4%BC%A0%E6%99%BA”; 然而,在向服务器发送大量的文本、包含非ASCII字符的文本或二进制数据时这种编码方式效率很低,所以才有了multipart/form-data编码方式。
2,multipart/form-data(又名多部分表单格式),用于向服务器发送大量的数据,常用语图片上传和文件上传,它既可以发送文本数据,也支持二进制数据上传。
编码方式:
-----------------------------11615134939957
Content-Disposition: form-data; name="b"
pppp
-----------------------------11615134939957
Content-Disposition: form-data; name="pro"
02
-----------------------------11615134939957--
3,application/json(json格式),作用,用于提交json数据(json数据本质是json格式的字符串),
编码方式:
4,text/plain(又名普通文本格式),
文本方式,传递的数据不进行改动,如zhanga=张id=1id
1,http协议角度
本质:Content-Type本质上是http的请求头中的一个设置,作用是发起http请求时,设置提交数据的格式和编码。
并且get请求没有这个请求头,不能手动设置。虽然get请求没有这个请求头,但是get请求使用默认的application/x-www-form-urlencoded的方式进行传递数据,post请求有这个请求头,并且可以手动设置进行更改默认的application/x-www-form-urlencoded
2,form表单角度
<form action="#"method="post"enctype="multipart/form-data">
b:<inputtype="text"name="b"id="ddd4" />
<selectname="pro">
<optionvalue="01">黑龙江省</option>
<optionvalue="02"selected="selected">辽宁省</option>
<optionvalue="03">吉林省</option>
<option>积极哈尔</option>
</select>
<!--文件上传控件-->
<!--<inputtype="file" name="pictureFile"/> -->
<inputtype="submit"value="提交"/>
</form>
通过enctype="multipart/form-data"属性进行设置,可以设置的值有application/x-www-form-urlencoded,multipart/form-data,text/plain,默认是application/x-www-form-urlencoded。注意:form表单提交使用的是http协议,同上,get请求提交表单不能设置该属性,默认使用application/x-www-form-urlencoded方式进行编码,post请求提交表单可以手动设置该属性,post请求提交表单默认当然也是使用application/x-www-form-urlencoded方式进行编码。
当上传控件进行文件或者图片上传时,只能使用post请求(因为get请求不能设置enctype),并且设置enctype="multipart/form-data",才支持上传。
3,ajax角度
$.ajax,$.get,$.post中默认都是使用application/x-www-form-urlencoded方式进行编码
ajax同样使用http协议,$.get发送get请求,不能手动更改Content-Type编码方式,$.post可以更改,$.ajax使用post方式提交时同理可以更改。
更改Content-Type时常用的方式:
1,使用ajax提交表单需要序列化表单,使其提交内容格式变成普通表单的提交格式(即application/x-www-form-urlencoded格式),这样才是表单提交的正确格式
function updateCustomer(){
$.post("<%=basePath%>customer/update.action",$("#edit_customer_form").serialize(),function(data){
if (data =='ok') {
alert("客户信息更新成功!");
window.location.reload();
}else{
alert('系统繁忙,请稍后再试');
}
});
}
$("#edit_customer_form").serialize()
$("#edit_customer_form")中的edit_customer_form是表单的id值,表示选中该表单
调用serialize()方法,即将表单的内容序列化,用来ajax提交其内容,这样就是使用默认的application/x-www-form-urlencoded
<form class="form-horizontal"id="edit_customer_form">
……
</form>
2,使用ajax提交json
$.ajax({
type:"post",
url:"${pageContext.request.contextPath}/items/sendJson.action",
contentType:"application/json;charset=utf-8",//指定从页面传给Controller的数据格式是什么样的
data:'{"name":"测试商品","price":99.9}',
success:function(data){
alert(data);
}
});
4,httpclient角度
httpclient提交数据,常见的是两种,
一种是通过模拟form表单,提交application/x-www-form-urlencoded(默认提交方式)编码的数据,
一种是提交json格式的数据
备注:
在Content-Type属性当中还是指定提交内容的charset字符编码。一般不进行设置,它只是告诉web服务器post提交的数据采用的何种字符编码。
一般在开发过程,是由前端工程与后端UI工程师商量好使用什么字符编码格式来post提交的,然后后端ui工程师按照固定的字符编码来解析提交的数据。所以这里设置的charset没有多大作用。