基础 - 响应的ContentType

  • 作者:KK

  • 发表日期:2017.11.30


介绍

响应报头中也有一个Content-Type,这个相信略有一两年开发经验的同学最熟知了,它当然就是表达了响应报文是什么格式的内容咯。

原则上来说,客户端应该要先判断这个报头是什么值,然后再决定如何解析响应报文,但规则是死的,人是活的,如果和个移动应用明知道/api/data接口会返回{"data":"dataValue"}这样的 JSON 数据,那完全可以直接解析 JSON 字符串而不需要if(contentType === 'application/json')再确定是否解析。

通常来说这个Content-Type影响的是一些通用型插件/软件的工作逻辑,因为这些东西是按照标准原则来设计的,例如浏览器

当一个浏览器得到一段 HTML,然后又从中找到一个 link 标签指向了 css 资源,如果服务端响应的报头不是text/css而是text/plain,那么某些浏览器得到这段CSS代码后并不会进行页面的渲染,其实也看具体的浏览器了,现在大部分浏览器会判断请求地址带 css 结尾就强制执行样式渲染,JS 什么的也是这样智能判断。

然后剩下会被影响的就是插件类,特别是广为人知的jQuery下面的 ajax 请求代码如果得到了text/html的响应头将无法解析 JSON:

$.get('/dataUrl', function(result){
	console.log(result);
});

但是如果这样写就可以无视服务端的返回类型,强制解析 JSON:

$.ajax({
	url : '/dataUrl',
	dataType : 'json',
	success : function(result){
		console.log(result);
	}
});

PHP设置Content-Type

header('Content-Type:application/json');

echo json_encode(['a' => 11]);

Node.Js设置Content-Type

res.setHeader('Content-Type', 'application/json');

res.end(JSON.stringify({a:11}))

Java Servlet设置Content-Type

response.setHeader('Content-Type', 'application/json');

response.getWriter().println('{"a":11}');