原理说明

Ajax的原理简单来说通过XmlHttpRequest对象来向服务器发异步请求,从服务器获得数据,然后用javascript来操作DOM而更新页面。XMLHttpRequest是ajax的核心机制,其原理此文不做阐述。通过对XMLHttpRequest对象的属性和方法的设置,与服务端之间进行基于http请求的消息传送。例如,XMLHttpRequest对象的setRequestHeader()方法是用来设置请求头的。这些过程都被封装在ajax中。在jquery ajax里,发送信息至服务器时内容编码类型的设置是通过contentType字段表示的。dataType表示预期服务器返回的数据类型。请求成功后的回调函数success中将返回根据 dataType 参数进行处理后的数据。

这里之所以提到contentType这个字段,是因为它表示数据实体的类型,前后端要约定一致,通常前端应根据后端的要求传送对应的contentType类型。类似于ajax的框架很多,它们都是基于XmlhttpRequest这个对象的,只是数据封装的形式略有不同。所以对此文content-type数据类型的理解,也有助于其他框架的数据类型传递时遇到的问题解决。

常见解决方式

遇到数据传递http请求的状态码为400时,通常会对content-type类型进行修改.

项目中常见的content-type有三种

application/x-www-form-urlencoded

application/x-www-form-urlencoded是常用的POST 提交数据的方式,普通的表单提交,或者js发包,如果不设置 content-type 属性,默认都是通过这种方式

application/json

现在越来越多的人把它作为请求头,用来告诉服务端消息主体是序列化后的 JSON 字符串。application/json用来告诉服务端消息主体是序列化后的 JSON 字符串,JSON 格式支持比键值对复杂得多的结构化数据。

multipart/form-data

使用表单上传文件时,必须让 form 的 enctyped 等于’multipart/form-data’。

如下是从基于JQuery文件上传插件ajaxfileupload.js中拷出来的一段代码,能帮助理解。

if (form.encoding) {

jQuery(form).attr('encoding', 'multipart/form-data');

}

else {

jQuery(form).attr('enctype', 'multipart/form-data');

}

数据发送时需要与后端之间协商好传送的数据类型,那么接收时也是同理的,接收时,ajax用到的字段是data-type。

特别说明,有时候content-type是后台要求的application/json,但是仍然报http码为400的错误,这是因为ajax内部会对data数据进行序列化转为字符串,而’自动’转为的字符串并非后台需要的字符串,需要在被自动转为字符串前先手动转为字符串(即JSON.stringify(data)),已经是字符串了就不会被自动转为字符串,详见案例分析。

关于data-type简单说明一下:"json"表示返回 JSON 数据;"text"表示返回纯文本字符串;"jsonp"表示JSONP 格式;"script"表示返回纯文本 JavaScript 代码。

案例解析

在后端已确定采用json形式传递的前提下,当前端向后端传送如下图一所示包含对象数组的数据对象时,采用如下代码一中的代码进行请求,该请求并没有成功。其中代码一中将contentType设为 "application/json; charset=utf-8"。

图一

代码一:

$.ajax({

url: basePath + "/visitor/addVisitor",

data: resultObj,

plugin: false,

contentType: "application/json; charset=utf-8",

success: function (data) {

$.toast({

message: "添加成功",

state: true

});

}

});

此时,查看浏览器中network,如下图二所示:

图二

显然请求没有成功,报了400的错误。

原因如下:

通过查看jquery源码,我们发现,ajax接收的数据最终都将转为字符串形式,如下是从jquery源码中截取的一段代码:

// Convert data if not already a string

if ( s.data && s.processData && typeof s.data !== "string" ) {

s.data = jQuery.param( s.data, s.traditional );

}

综上,解决执行代码一时出现的http请求为400的情况,需将data自己手动转为JSON字符串(JSON.stringify(data)),这样就无需走JQuery里面的param函数进行序列化转换了。也就是说避免出现图二箭头所示的错误情况,图二所示的情况是将接收的对象默认序列化为键值对的形式。

如下附上正确的代码:

$.ajax({

url: basePath + "/visitor/addVisitor",

data: JSON.stringify(resultObj),

plugin: false,

contentType: "application/json; charset=utf-8",

success: function (data) {

$.toast({

message: "添加成功",

state: true

});

}

});

总结

案例中,content-type是对的,是前后台协商一致的application/json,但是传输的数据data必须先进行JSON.stringify(data),原因是前后端传送的必须是字符串,可以通过查看JQuery源码得知,如果data不是字符串,JQuery内部会将其进行序列化转为字符串,而序列化后的数据并非后端需要的,导致http状态码为400的错误。

Ajax的属性配置均是基于对XmlhttpRequest对象的方法调用的封装。对其深入理解,一方面需要理解http协议的原理,另一方面需要参照xmlhttpRequest对象原理读懂jquery ajax源码。对ajax理解也有助于理解其他基于xmlhttpRequest对象封装的框架。

jquery ajax content type,JQuery ajax的contentType相关推荐

  1. $.ajax的type属性,$.ajax中contentType属性为“application/json”和“application/x-www-form-urlencoded”的区别...

    说明: application/json和application/x-www-form-urlencoded都是表单数据发送时的编码类型. contentType: 发送信息至服务器时内容编码类型,简 ...

  2. ajax请求type种类,ajax配置项中的type与method

    1. jQuery中ajax配置项中的使用type与method的区别 本质上两个配置项是没有区别的,区别在于两者出现的时间不同,type对于目前jQuery的版本全部兼容,也就是说 $.ajax({ ...

  3. ajax content download,关于ajax的content-download时间过慢问题的解决方案与思考

    前言: 作前端架构好久好久了,常常到我这里都是些棘手的问题,以前没有养成很好的记录问题的习惯,之后会努力成文,积累. 因而今天就有个这篇文章.关于ajax的content-download时间过慢问题 ...

  4. 【转】Jquery -Ajax 入门练习 Jquery.Ajax 调用后台函数,获取DataTable Json,Asp.net

    直接上图=============最后拷贝源码(图片清楚) ====================================================================== ...

  5. PHP、jQuery、jQueryPager结合实现Ajax分页

    建立html文件: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://w ...

  6. 【SpringMVC笔记】Ajax 入门(jQuery.ajax)

    Ajax Ajax 简介 伪造 Ajax(iframe标签) jQuery.ajax 使用 jQuery.ajax 案例 Ajax 执行流程 Ajax 异步加载数据案例 Ajax 验证用户名密码 获取 ...

  7. jQuery源码分析之$.ajax方法

    请阅读我其它的关于inspectPrefiltersOrTransport以及ajaxTransport等相关博文,请了解readyState状态码 针对获取到location.href的兼容代码: ...

  8. 杨老师课堂之Jquery的筛选,事件,效果,Ajax,javascript跨域)

    1 筛选[掌握]  筛选与之前"选择器"雷同,筛选提供函数 1.1 过滤 eq(index|-index),获取第N个元素 •index:一个整数,指示元素基于0的位置,这个元素 ...

  9. 【jQuery教科书】从jQuery语法到jQuery ajax的每一个知识点(学习总结)

    文章目录 @[toc] 一.jQuery概述 1.1 什么是jQuery? 1.2 jQuery的版本须知 1.3 jQuery的功能作用 1.4 为什么要使用jQuery? 1.5 jQueryAP ...

最新文章

  1. 基于深度学习的目标检测研究进展
  2. 5g的八大关键指标_你对5G技术标准了解多少(干货)
  3. 文件传输服务器多目录,node ftp 模块 如何把本地多个文件夹或者文件上传到服务器...
  4. Codeforces Round #736 (Div. 1Div2)
  5. Eclipse配置初始化(自用)
  6. Introduce Foreign Method(引入外加函数)
  7. 基于阿里云数加MaxCompute的企业大数据仓库架构建设思路
  8. python代码控制机械臂_选用什么样的系统或平台开发机器人/机器臂?
  9. 一些图像处理函数用法
  10. Stanford NLP - 命名实体识别 - NERClassifierCombiner
  11. 万物皆可秒——淘宝秒杀Python脚本,扫货618,备战双11!
  12. 浅谈Es6中import * as xxx from几种基本用法
  13. 数据库的挂起(suspending)和恢复(resuming)
  14. 保研计网复习笔记:数据链路层
  15. 计算机cmd卸载软件,在CMD模式下如何卸载软件
  16. DIY个人智能家庭网关—— 路由器篇之申请公网IP
  17. python输入n个数、输出最小的数字_程序查找最少的斐波纳契数以在Python中加到n?...
  18. Codeforces Round #835 (Div. 4) - D. Challenging Valleys
  19. 程序员笑话:只有程序猿才看得懂
  20. 计算机打开没有磁盘管理员权限设置,win10专业版中更改磁盘没有权限“需要管理员权限”...

热门文章

  1. 计算机基础-数据存储
  2. WOS(Web of Science)检索规则
  3. Word高效指南 - 快速合并多个文档
  4. 英雄联盟怎么解除小窗口_英雄联盟手游安妮怎么样 英雄联盟手游安妮技能介绍...
  5. 计算机房管理使用汇报,计算机房管理规定(附计算机房使用记录).doc
  6. 磁条卡磁道笔记(2)
  7. 阿里HBase超详实践总结 | 一文读懂大数据时代的结构化存储
  8. [渝粤教育] 西南科技大学 律师实务 在线考试复习资料2021版(1)
  9. VB 数据库交互(二)——经典五实例总结
  10. c语言字节溢出,C语言变量定义与数据溢出(初学者)