- 首先请看下面的ajax封装函数:
function ajaxset_new(posturl, postdata, successfunction) {
$.ajax({
// contentType: "application/json; charset=utf-8",
contentType: "application/x-www-form-urlencoded; charset=utf-8",
url: posturl,
type: 'POST',
dataType: 'json',
data: postdata,
cache: false,
async: false, //是否异步请求
success: successfunction,
complete: showdata,
statusCode: {
404: ajaxset_alert
},
error: errorHandling
});
}
第二个content-type是最老的最常用的——可以说让我想起了做servlet的经验。使用它可以达到自动解析postdata里面的参数值和对,就像解析了get请求中的url里的参数值和对。
但是如果postdata只是json数据呢?此时相对于第一种content-type是否就没有区别了?第一种一直都是一种相应头,进来逐渐被用作请求头。这个时候前端提交的数据是 json格式的字符串
form的enctype属性为编码方式,常用有两种:application/x-www-form-urlencoded和multipart/form-data,默认为application/x-www-form-urlencoded。 当action为get时候,浏览器用x-www-form-urlencoded的编码方式把form数据转换成一个字串(name1=value1&name2=value2...),然后把这个字串append到url后面,用?分割,加载这个新的url。 当action为post时候,浏览器把form数据封装到http body中,然后发送到server。 如果没有type=file的控件,用默认的application/x-www-form-urlencoded就可以了。 但是如果有type=file的话,就要用到multipart/form-data了。浏览器会把整个表单以控件为单位分割,并为每个部分加上Content-Disposition(form-data或者file),Content-Type(默认为text/plain),name(控件name)等信息,并加上分割符(boundary).
POST http://www.example.com HTTP/1.1
Content-Type: application/json;charset=utf-8
{"title":"test","sub":[1,2,3]}
最近老是有前端同事问我在用Aangular的$http服务器的时候向服务器发送数据不成功,后来我测试了一下,发现服务器的接口接收的数据的格式是form表单形式,而Angular的$http服务发送的post请求默认是json数据格式所以数据接收不到
ajax传JSON时设置的contenttype 如果是application/json或者text/json时,JAVA中request.getParameter("")怎么也接收不到数据,如果将contenttype 换成application/x-www-form-urlencoded 就好了
contentType: 告诉服务器,我要发什么类型的数据
dataType:告诉服务器,我要想什么类型的数据,如果没有指定,那么会自动推断是返回
XML,还是JSON,还是script,还是String。
application/x-javascript text/xml->xml数据 application/x-javascript->json对象 application/x-www-form-urlencoded->表单数据 application/json;charset=utf-8 -> json数据
不使用contentType: “application/json”则data可以是对象
data: { id: nodeId },
使用contentType: “application/json”则data只能是json字符串
data: "{'id': " + nodeId +"}",
$.ajax({
url: actionurl,
type: "POST",
datType: "JSON",
data: { id: nodeId },
async: false,
success: function () {}
});
$.ajax({
url: actionurl,
type: "POST",
datType: "JSON",
contentType: "application/json"
data: "{'id': " + nodeId +"}",
async: false,
success: function () {}
});
http://blog.csdn.net/calyxmelo/article/details/54969244
选择application/x-www-form-urlencoded还是application/json,得看你是否有从request.paramter获取请求数据的需求。
http://blog.csdn.net/HEL_WOR/article/details/52123712
最近在看书时才真正搞明白,服务器为什么会对表单提交和文件上传做特殊处理,因为表单提交数据是名值对的方式,且Content-Type为application/x-www-form-urlencoded,而文件上传服务器需要特殊处理,普通的post请求(Content-Type不是application/x-www-form-urlencoded)数据格式不固定,不一定是名值对的方式,所以服务器无法知道具体的处理方式,所以只能通过获取原始数据流的方式来进行解析。
jquery在执行post请求时,会设置Content-Type为application/x-www-form-urlencoded,所以服务器能够正确解析,而使用原生ajax请求时,如果不显示的设置Content-Type,那么默认是text/plain,这时服务器就不知道怎么解析数据了,所以才只能通过获取原始数据流的方式来进行解析请求数据。
http://blog.csdn.net/mhmyqn/article/details/25561535
对我们而已最大的区别,老的content-type不会导致在前端发出去options请求,而是直接post请求。这样后端可以使用tomcat(bw tomcat不支持options请求,而此处刚好省掉了options请求),同事只需要设置Access-Control-Allow-Origin这一个http头允许"*"就可以了,可以忽略其他多个跨域相关的http header.
那么使用老的content-type,在设计adn项目时put请求出过问题?出现了options请求,所以修改了bw http connection的serverType到httpComponent?