2018-03-20 前后端分离项目会有哪些坑之ajax

  1. 首先请看下面的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?

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容