http 头部中的 content-type 和我们传递的数据以及后台处理数据的方式是息息相关的,不同的取值,服务器解析处理方式不同。
协议规定 POST 提交的数据必须放在消息主体(entity-body)中,但协议并没有规定数据必须使用什么编码方式。实际上,开发者完全可以自己决定消息主体的格式,只要最后发送的 HTTP 请求满足上面的格式就可以。
但是,数据发送出去,还要服务端解析成功才有意义。一般服务端语言如 php、python 等,以及它们的 framework,都内置了自动解析常见数据格式的功能。服务端通常是根据请求头(headers)中的 Content-Type 字段来获知请求中的消息主体是用何种方式编码,再对主体进行解析。
text/plain:ajax
默认方式,将文件设置为纯文本的形式,浏览器在获取到这种文件时并不会对其进行处理(最原始的流)
application/x-www-form-urlencoded
form表单默认的方式,在$.ajax中如果未设置contentType默认也会以这种方式, 在servlet中的把对应的key、value进行相应的处理添加到Map中,所有才能通过request.getParameter()获取,在servlet中的request.getParameter()只能取到 在url 后面的参数与 这种方式提交的数据。
[图片上传失败...(image-efdf46-1536411721990)]
注意: 这种方式传递的数据千万不能乱用JSON.Stringify()格式化,只能传入原始对象(LZ开始就犯了这样的错,导致取不到值)
var info={
"name":"yhy",
age:22
}
$.ajax({
url: 'ddds' ,
type: 'post',
data: info,
async: true,
dataType:'json',
success: function (data,state) {
},
error: function (data,state) {
} ,
});
multipart/form-data
多用于文件上传,html5伴随出现的formdata 也正用于此(支持普通表单、文件上传,若是传文件则服务器采用特有formdata的解析方式),传递的时候通过流的形式,数据包的格式也有所不同。
注意:这里 传入的数据必须格式化JSON.stringify(),不能直接传入原始对象,servlet中解析的时候通过读流的方式(不包含formdata格式)
StringBuffer json = new StringBuffer();
String line = null;
try{
BufferedReader reader = request.getReader();
while((line=reader.readLine())!=null){
json.append(line);
}
}
catch(Exception e){
System.out.println(e.toString());
}
System.out.println(json.toString());
application/json
这是现在比较常用的方式,在发送数据之前需格式化数据JSON.stringify(),确保格式的正确性,服务器解析方式和上面第二种一样,先获取json字符串在转为JSON对象。
数据传输通过chrom开发工具可获取到的数据
1、get方式,会在url后面添加参数,并在包含在 Query String parameters
20161102184946023.png
2、post方式
a、form-data, 这种设置conten-type为application/x-www-form-urlencoded ,servlet 中可通过request.getParameter()获取
b、Request-Payload,通过输入流来获取,在上面已介绍。
网友评论