Web 技术研究所

我一直坚信着,Web 将会成为未来应用程序的主流

跨域时的类型 Content-Type 设置

  在很多 XHR 封装中都会对请求头的 Content-Type 字段做设置,比如 jQuery 默认使用「application/x-www-form-urlencoded」,这个是完全没问题了,即使是 CORS,且目标服务器没有设置「Access-Control-Allow-Headers」也没问题。但如果使用其他类型就不行了。

jQuery::ajax VS Angular::$http

  CORS 时默认只支持「application/x-www-form-urlencoded」,所以 jQuery 的 ajax 方法可以正常工作,而 Angular 的 $http 由于默认使用「application/json」所以在服务器的「Access-Control-Allow-Headers」缺省时无法请求成功。可以使用下面代码测试(请自带 jQuery 和 Angular)。 //nodejs
require('http').createServer(function(req,res){
  res.setHeader('Access-Control-Allow-Origin','*');
  res.end('ok');
}).listen(1234);
<script src="bower_components/jquery/dist/jquery.js"></script>
<script src="bower_components/angular/angular.js"></script>
<script>
$.ajax({
  type:"post",
  url:"http://127.0.0.1:1234/",
  data:{a:1},
}).done(function(e){
  console.log("jQuery OK");
});

angular.module("app",[]).controller("ctrl",["$http",function($http){
  $http({
    method:"post",
    url:"http://127.0.0.1:1234/",
    data:{a:1}
  }).success(function(e){
    console.log("Angular OK");
  });
}]);
</script>
<body ng-app="app" ng-controller="ctrl"></body>

谁的责任?将来会如何?

  当然只要做一些手动调整就可以解决这个问题,而且 Angular 的「application/json」确实是更先进的东西,Angular 没有错,jQuery 也没有错,错的应该是 CORS,是浏览器提供的默认支持程度太低。实际上「applications/json」同「application/x-www-form-urlencoded」一样是安全的,也是标准的,只是浏览器目前支持的还不好而已。我相信过不了多久「Access-Control-Allow-Headers」缺省时对这些的支持应该也会有。

网名:
54.144.24.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^