`

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

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

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

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

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

普通文本 : text/plain
HTML代码 : text/html
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形式
<script type="text/javascript">
 var user = {
   name : "Tom",
   age : 12
};
</script>

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


javascript形式
 var user = {
   name : "Tom",
   age : 12
};

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


json形式
 {
   name : "Tom",
   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处理应该没什么问题)

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

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

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


分享到:
评论
15 楼 gongmingwind 2010-01-27  
需要经常总结
14 楼 xzkcz 2009-02-24  
很全面,很实用,学习了。。。
13 楼 Snow_Young 2009-02-01  
感觉全冠清是在反嘲下一站童鞋。
12 楼 shhbobby 2009-02-01  
支持,收藏
11 楼 xiaonian1986 2009-01-29  
呵呵,支持一下
10 楼 lgn21st 2009-01-21  
好文,收藏之...谢谢小胖分享
9 楼 zcfg 2009-01-21  
严谨、远见
8 楼 yingwuhahahaha 2008-12-11  
请问小胖,设置了正确的response类型和不设置有什么区别呢?我是指对用ajax方式请求的情况下。。
7 楼 qichunren 2008-12-11  
flash文件(swf)contentType是什么?

application/x-shockwave-flash
这个不行
6 楼 southgate 2008-12-10  
不错 这种细节很体现功力
5 楼 fins 2008-12-10  
全冠清 写道

引用
哥哥,我用prototype,都封装好了,这个东西跟我一毛钱关系也没有我用jQuery,这些也和我一毛钱关系也没有。


我说的是 response的东西 你和 下一站怎么不仔细看帖子呢

你的意识是 jquery 能够帮你在 java /php/.net 里自动的加上类似
response.setHeader(".....") 这类代码吗???
4 楼 全冠清 2008-12-10  
引用
哥哥,我用prototype,都封装好了,这个东西跟我一毛钱关系也没有

我用jQuery,这些也和我一毛钱关系也没有。
3 楼 花花公子 2008-12-10  
response header是render :json或者render :update的时候干的事情。
2 楼 fins 2008-12-10  
小弟弟
我很好奇 prototype 啥时候出 服务端的代码了?

prototype 在 request 的header 里设置了 contentType ,

response header 它也能管?

下一站同学 显然 你这次的抬杠又失败了 
1 楼 下一站,火星 2008-12-10  
哥哥,我用prototype,都封装好了,这个东西跟我一毛钱关系也没有

相关推荐

    http请求contentType和response.md

    http中的contentType和responseType: contentType的主要类型和responseType的类型

    ajax中设置contentType: “application/json”的作用

    最近在做项目交互的时候,刚开始向后台传递数据返回 415 ,后来百度添加了 contentType:“application/json“ 之后返回400,然后把传输的数据格式改为json字符串就传输成功了,现在我们来看看 contentType:...

    ajax中设置contentType: "application/json"的作用

    主要介绍了ajax中设置contentType: “application/json”的作用,需要的朋友可以参考下

    asp.net下Response.ContentType类型汇总

    asp.net下Response.ContentType类型汇总

    HTML中的ContentType

    HTML中的ContentType Content-Type,连接类型,一般是指网页中存在的Content-Type,用于定义网络文件的类型和网页的编码,决定浏览器将以什么形式、什么编码读取这个文件。 例如将:ContentType设置为image/jpeg,...

    ajax快速解决参数过长无法提交成功的问题

    在ajax中使用post方法,用常规的参数格式:param1=a1&param2=a2 ,当参数长度过长时,依然提交不成功。比如我们经常这样写一个ajax的post请求: $.ajax({ type: "post", // post or get contentType:"application...

    PageEncoding&contentType中charset区别

    PageEncoding&contentType中charset区别,遇到了与大家分享!

    ContentType 类型大全 doc

    ContentType 类型大全 doc

    struts2 文件上传中 ContentType对应表

    struts2 文件上传中 ContentType对应表

    JQueryAjax

    jquery 简化了 ajax的开发 using System; using System.Web; using System.Web.SessionState; public class HandingPersonInfo : IHttpHandler,IReadOnlySessionState { public void ProcessRequest ...

    Ajax传输中文乱码问题的解决办法

    ajax传输中文乱码问题描述:  我是在一个jsp页面有一个保存按钮,点击时会触发saveForm()的js函数,在saveForm()函数里经过校验后,会通过ajax发送数据请求,这样就不用通过提交表单来传输数据了,ajax估计就是...

    ajax中文乱码问题解决方案

    ajax中文乱码问题在中文中经常会出现这种问题,其实只要稍加注意就不会出现ajax中文乱码这回事情了,注意前后台编码一致.你用的是中文.而ajax传输数据的时候用的是utf-8 ,还有对ajax get方法时最好escape 或urlcode,...

    Ajax请求session超时处理流程

    response.sendRedirect(response.encodeRedirectURL("/ajaxDone.jsp"); else { response.sendRedirect(response.encodeRedirectURL(this.loginUrl + java.net.URLEncoder.encode(backToUrl, "UTF-8"))); } ...

    jQuery的ajax发送FormData的方式

    // - contentType : false $.ajax({ method : 'POST', url : '/ajax_Day5/datas03.php', data : fd, success : function (data) { console.log(data); }, processData : false, contentType : false }); ...

    $.ajax中contentType: “application/json” 的用法详解

    主要介绍了$.ajax中contentType: “application/json” 的用法,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下

    Java获取文件ContentType案例

    主要介绍了Java获取文件ContentType案例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

    jquery.js(可以在ajax中传输中文参数)

    ajaxSettings:{url:location.href,global:true,type:"GET",contentType:"application/x-www-form-urlencoded; charset=UTF-8", 修改了jquery.js,添加了charset=utf8之后ajax就能传输文佬参数过去后台

    ContentType类型大全彩信[参考].pdf

    ContentType类型大全彩信[参考].pdf

    ajax文件上传

    首先,form表单提交文件后必须完成跳转,而且样式体验较差;尽管能够采用iframe跳转方式,但是代码量过大过于复杂;同时,ajax并不支持文件的...采用MultiartRequest,帮助没有采用框架开发的WEB初学者解决文件上传问题

    如何将图片转换成二进制存储

    针对Response.ContentType的值,除了针对图片的类型外,还有其他的类型: Response.ContentType = "application/msword"; Response.ContentType = "application/x-shockwave-flash"; Response.ContentType = ...

Global site tag (gtag.js) - Google Analytics