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

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

纠结于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' 



3 

服务端 判断 客户端 提交的是否是 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处理应该没什么问题) 



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



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



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

更多相关:

  • 推荐四篇文章: JavaScript 是单线程的深入分析JavaScript 运行机制详解:再谈 Event LoopJavaScript 异步编程的4种方法JavaScript 既是单线程又是异步的,请问这二者是否冲突,以及有什么区别?一个重要前提:JavaScript 是单线程的,并且只有一个主线程。 我们常说的 JavaScri...

  • 如果由于table中有一个下拉框,还有一个treeview时,treeview的所有节点都是取于下拉框的下拉选项来的,所以在第一定位这之后,当选择其他下拉框中其他的选项时,DIV的scrollTop值是会一直保存前一个步聚DIV滚动条所在的位置的

    在Ubuntu 14.04 64bit上为Sublime text 3安装搜狗拼音输入法

    Sublime text 3不支持中文输入法,下面是我结合网上的各种资料摸索实践了一遍,为Sublime text 3成功添加了搜狗拼音输入法,特此记录以备参考。 前提条件: 事先安装并配置好搜狗拼音法和Sublime text 3编辑器,参考本博客相关文章。 1.安装相关依赖库 sudo apt-get install bui...

  • 当下人工智能是真心的火热呀,各种原来传统的业务也都在尝试用人工智能技术来处理,以此来节省人工成本,提高生产效率。既然有这么火的利器,那么我们就先来简单认识下什么是人工智能吧,人工智能是指利用语音识别、语义理解、图像识别、视觉处理、机器学习、大数据分析等技术实现机器智能自动化做出响应的一种模拟人行为的手段。而我们这里介绍的Magpie则...

  • from selenium import webdriver from scrapy.selector import Selector#模拟登陆 browser = webdriver.Chrome(executable_path='Chromedriver.exe') #路径是Chromedriver.exe的存放位置,windo...

  • 需求:单表关联问题。从文件中孩子和父母的关系挖掘出孙子和爷奶关系 样板:child-parent.txt           xiaoming daxiong          daxiong alice          daxiong jack 输出:xiaoming alice         xiaoming jack 分析设...

  •  hadoop 的核心还是 Map-Reduce过程和 hadoop分布式文件系统   第一步:定义Map过程 /**  *  * Description:  *  * @author charles.wang  * @created Mar 12, 2012 1:41:57 PM  *   */ public class MyMa...

  • THE START更新堪称轻量级MATLAB的一款软件最新版-Maplesoft Maple 2019.2 中文版。Maple是符号和数字计算环境,也是一种多范式编程语言,由Maplesoft开发,还涵盖了技术计算的其他方面,包括可视化,数据分析,矩阵计算和MATLAB连接。MapleSim工具箱添加了用于多域物理建模和代码生成的...

  • 同学们,你们在学习他人的代码,是否见过这样的代码 def main(): def user_info(gender): 当你还是个小萌新时,你一定会认为这是个很牛逼的语法。 当你有了一点基础时,你一定会想要了解这个语法,并且尝试去使用它。 那么今天,我们便来了解这个牛语法。 有了一点点的python基础,我们来看这段代...

  •     自从用了这些快捷键,鼓励师也不需要了,代码开发效率蹭蹭提升!!! ctrl+shift+[折叠代码 (这个比ctrl+k ctrl+l、ctrl+k ctr+j不知道好用多少倍!) ctrl+shift+]展开代码 ctrl+shift+T打开手贱不小心关掉的窗口 【推荐】ctrl+shift+O打开当前文件...

  • 在提交代码之前,建议最好先Fetch代码下来(如果有冲突,系统会提示),然后再操作Merge到本地分支,这样做是为了避免有其他人同时修改了当前分支,如果直接用Ctrl+T(pull代码)极有可能覆盖本地分支最新代码,安全起见先Fetch代码(Ctrl+Alt+Shift+1)——所谓:小心驶得万年船!...

  • 每次复制代码时,如果代码里有 // 这样的注释就容易让格式乱掉,通过下面的设置就可以避免这种情况。 粘贴代码时取消自动缩进 VIM在粘贴代码时会自动缩进,把代码搞得一团糟糕,甚至可能因为某行的一个注释造成后面的代码全部被注释掉,我知道有同学这个时候会用vi去打开文件再粘贴上去(鄙人以前就是这样),其实需要先设置一下 s...