纠结于ajax开发中 response的contentType 问题

博客分类: web前端

AjaxjsonJavaScriptjQuery应用服务器 

ajax开发中, 常遇到下面的几种情况:

1 服务端需要返回一段普通文本给客户端 
2 服务端需要返回一段HTML代码给客户端 
3 服务端需要返回一段XML代码给客户端 
4 服务端需要返回一段javascript代码给客户端 
5 服务端需要返回一段json串给客户端

================================

对于每一种返回类型 规范的做法是要在服务端指定 response的contentType 的. 
(当然 不指定绝大多数情况下也没什么问题 尤其是返回"非xml"的时候)

Java代码  
  1. 普通文本 : text/plain
  2. HTML代码 : text/html
  3. XML代码 : text/xml

以上三个可以说是毫无争议的, 也没什么值得讨论的, 
但是另外两种情况 就要注意一下了. 

javascript 的 contentType 按最标准的写法 应该是 application/javascript. 
而常用的 text/javascript 已经被 rfc定义为废弃的. 
(参见 rfc4329)

但是 在这里暂时不建议使用 application/javascript . 
大家还是继续使用 text/javascript 为好. 
因为很多老旧浏览器并不支持 application/javascript . 
而所有浏览器都支持 text/javascript. 
在标准和广泛的兼容性之间 还是暂且选择后者吧.

json 的 contentType 常见写法有 : text/json & text/javascript . 
但是 这个 text/json 其实是根本不存在的, 
而 text/javascript 在有些时候客户端处理起来会有歧义. 
对于json的contentType , rfc里定义的标准写法是 :application/json. 
(参见 rfc4627)

在这里毫无疑问 我们应该选择标准写法的 application/json.

====================== 
也许有人会问, 设置这些有什么用呢? 
以前一些程序没有设置这些东西 运行的也很好啊.

首先必须承认的一点是, 这些信息 在目前绝大多数情况下 确实不设置也可以. 
但是这种做法是不规范不标准的.

未来对于复杂的ajax应用 ,不规范的行为是会带来很大的隐患.

举个例子.

对于同样的内容 可以有下面的3种形式

html形式

Html代码  
  1. <script type="text/javascript">
  2. var user = {
  3. name : "Tom",
  4. age : 12
  5. };
  6. </script>

对于 html 形式,客户端得到数据后,往往是对其做dom操作.

javascript形式

Javascript代码  
  1. var user = {
  2. name : "Tom",
  3. age : 12
  4. ;

对于 javascript形式,往往是对其做eval操作: 
eval(responseText);

json形式

Javascript代码  
  1. {
  2. name : "Tom",
  3. age : 12

对于 json形式,往往是对其做  eval操作之后 赋值给某变量: 
var clientVar= eval(responseText);

客户端拿到不同形式的代码 所要做的工作是不一样的. 
如果没有设置 contentType 客户端很难判断 返回的数据是什么, 该怎么处理.

==========================

另外,对于返回信息,如果不设置contentType,web服务器往往会给返回的内容添加一个"默认的contentType", 
但是这个"默认"会根据服务器的不同 以及web应用配置的不同而不同.

而浏览器对于没有足够头信息的返回值 也会做出"某些默认行为(打开 或下载 或报错". 
总之 不同浏览器 不同的浏览器设置 结果可能是不一样的 无法把控.

也就是说 当我们不指定正确的contentType时, 我们所能做的只能是祈祷 在所有环境中, 程序的表现是一致的, 
但是与其"祈祷"不如我们亲自把这些信息加上来得可靠.

所以 正确设置返回信息的 contentType  还是很有必要的.

====================== 
总结 & 建议 : 
1.

服务端 向 客户端 发送 JSON数据 时: 
Content-Type = 'application/json;charset=UTF-8'

2. 
服务端 向 客户端 发送 JS 代码 时: 
Content-Type = 'text/javascript;charset=UTF-8'


服务端 判断 客户端 提交的是否是 JSON数据 时 :

Content-Type = 'application/json;charset=UTF-8' 
Content-Type = 'text/json;charset=UTF-8' 
Content-Type = 'text/javascript;charset=UTF-8' 
Content-Type = 'application/javascript;charset=UTF-8'

只要 Content-Type 满足上面4个条件中的 任意一个时,就可以认为提交的数据是 JSON数据. 
之所以要提供4种选择 是因为 为了提供更好的兼容性. 
(我想没有人会提交真正的js代码到服务端 然后用服务端js引擎去解析执行吧? 
即使真有这种需求 也可以在js代码外包一层 json格式的 wrapper , 
所以姑且都当作json处理应该没什么问题)

======================

唉 又一篇蛮纠结于无聊细节的短文 就这样结束了

如有不对 还请斧正 谢谢了.

纠结于ajax开发中 response的contentType 问题相关推荐

  1. Ajax 开发中遇到的乱码问题

    Ajax开发过程中提交获取数据的乱码问题 摘录 # re: Ajax开发过程中提交获取数据的乱码问题 2006-09-06 15:32 | 乌鸦在黑夜里飞 实际上所有的问题都来自编码的不统一: 1.H ...

  2. Web开发中的AJAX技术介绍

    读音:e:j^ks .AJAX即"Asynchronous JavaScript and XML"(异步JavaScript和XML),AJAX并非缩写词,而是由Jesse Jam ...

  3. response的contentType 常见几种类型

    ajax开发中在请求服务器端的响应时, 对于每一种返回类型 规范的做法是要在服务端指定response的contentType 常遇到下面的几种情况: 1. 服务端需要返回一段普通文本给客户端,Con ...

  4. Struts2.0第三章(文件上传、ajax开发、json、Fastjson、Jackson、注解开发)

    Struts2.0文件上传: 浏览器端注意事项: 1.表单提交方式method = post: 2.表单中必须有一个<input type="file" name = &qu ...

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

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

  6. 前端开发中的MCRV模式

    针对前端开发中基于ajax的复杂页面开发所面临的代码规模大,难以组织和维护,代码复用性.扩展性和适应性差等问题,本文尝试以MVC思想为基础,结合Web前端开发中内容-结构-表现-行为相分离的开发标准, ...

  7. 使用 jQuery 简化 Ajax 开发.

     使用 jQuery 简化 Ajax 开发. jQuery 是一个JavaScript 库,它有助于简化 JavaScript™ 以及 Asynchronous JavaScript + XML (A ...

  8. 使用jquery简化ajax开发

    jQuery 是什么? 请访问 Ajax 技术资源中心,这是有关 Ajax 编程模型信息的一站式中心,包括很多文档.教程.论坛.blog.wiki 和新闻.任何 Ajax 的新信息都能在这里找到. j ...

  9. ASP.NET AJAX 在Web开发中的应用

    摘 要 ASP.NET AJAX 实现了Web页面丰富的部分刷新效果.本文通过介绍AJAX原理,引申到ASP.NET AJAX原理,并总结了在Web 开发应用中要注意的若干问题.合理地利用ASP.NE ...

最新文章

  1. 运维企业专题(9)RHCS集群工具介绍
  2. 八篇 NeurIPS 2019 最新图神经网络相关论文
  3. 玄惭 mysql_阿里云数据库专家玄惭的“武功”全记录之最佳实践、双十一特别篇...
  4. 串口通信模块2:串口通信编程基础(打开、配置)
  5. C/C++网络编程中的TCP保活
  6. SAP UI5 应用开发教程之五十二 - 如何使用 SAP UI5 的标准控件结合 Cordova 插件调用手机摄像头进行条形码扫描试读版
  7. IOS15之swift的Alamofire 5.4框架的网络封装
  8. mathematica在linux上运行,Mathematica在Ubuntu中的表现及修正
  9. 夜间工作致癌的原因被发现:熬夜破坏了癌症相关基因的节律,导致DNA损伤增加、修复效率降低...
  10. linux那些事之中断与异常(AMD64架构)_2
  11. 如何二值图转化为灰度图_AAAI 2020 | 时序转化为图用于可解释可推理异常检测
  12. Json 入门例子【3】
  13. 亿级用户下的新浪微博平台架构
  14. 10.SpringBoot学习(十)——JDBC之 Spring Boot Jpa
  15. android wear 2.0 表盘开发,android wear手表开发如何获取所有的表盘(动态)以及切换表盘...
  16. jdk重复安装,Error:Registry key ‘Software\JavaSoft\Java Runtime Environment\CurrentVersion(已解决)
  17. 小鸡腿U T6 2013FINAL
  18. MPB:南农韦中组-​​根际细菌产铁载体能力的高通量检测
  19. ipa文件上传到iTunes Connect
  20. 4. 数据统计分析基础知识

热门文章

  1. 有关matlab拟合工具箱的使用
  2. 【调参实战】如何开始你的第一个深度学习调参任务?不妨从图像分类中的学习率入手。...
  3. 中国火电设备市场发展方向与投资策略研究报告2022版
  4. 中国新能源商用车行业投资现状及前景规划分析报告2022-2027年版
  5. 全球与中国智慧物流市场”十四五“发展状况及投资前景规划报告2021-2027年版
  6. 产销对接行动倡议书-万祥军:长效机制谋定丰收节交易会
  7. Functions that return a function
  8. 关于SUID、SGID、Sticky
  9. SQL中like的用法
  10. C++模板类注意事项