在Angular中使用Parse Client Key会产生CORS错误

时间:2015-11-29 02:11:11

标签: javascript angularjs parse-platform cors

我正在尝试使用客户端密钥从Parse检索一个类(使用GET)。我能够使用Advanced Rest Client for Google Chrome发送成功的请求;我使用了X-Parse-Application-IdX-Parse-Client-Key标题。

[edit] [edit2] 响应标头(从Chrome开发者工具选项中获取):

  

HTTP / 1.1 200确定

     

Access-Control-Allow-Headers:X-Parse-REST-API-Key,X-Parse-Javascript-Key,X-Parse-Application-Id,X-Parse-Client-Version,X-Parse-Session -Token,X-Requested-With,X-Parse-Revocable-Session,Content-Type

     

Access-Control-Allow-Methods:OPTIONS,POST,GET,PUT,DELETE

     

Access-Control-Allow-Origin:*

     

Access-Control-Max-Age:86400

     

Content-Type:application / json;字符集= UTF-8

     

日期:太阳,2015年11月29日04:23:08 GMT

     

服务器:nginx / 1.6.0

     

X-Parse-Platform:G1

     

X-Runtime:0.000118

     

内容长度:0

     

连接:保持活力

但是,尝试在Angular应用程序中执行相同操作会出现以下错误:

XMLHttpRequest无法加载https://api.parse.com/1/classes/GenResources。在预检响应中,Access-Control-Allow-Header不允许使用请求标头字段X-Parse-Client-Key。

Parse说它支持使用cross-origin resource sharing,我之前能够使用不同的客户端提出请求,所以我非常确定服务器不是问题所在。我无法修改响应头的内容。

这是我用来形成GET请求的代码。

var ng_portal = angular.module("ngPortal", []);
ng_portal.controller("GenResourcesCtrl", ["$http", function($http) {
  $http({
    method: "GET",
    url: PARSE_URL + "/1/classes/GenResources",
    headers: {
      "Content-Type": "application/json",
      "X-Parse-Application-Id": PARSE_APP_ID,
      "X-Parse-Client-Key": PARSE_CLIENT_KEY
    }
  }).then(
    function success(res) {
      console.log(res);
    },
    function error(res) {
      console.log(res);
    }
  );
}]);

2 个答案:

答案 0 :(得分:3)

您正在请求中设置自定义标头,这将触发飞行前(OPTIONS)请求。该请求的响应必须包含名为" access-control-allow-headers"值为您尝试设置的标题列表。

请参阅https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS

特别是关于飞行前请求的部分。

我建议使用浏览器开发人员工具查看请求和响应的标头,看它们是否符合CORS规范。从您提供的错误消息,它看起来像托管您正在进行的跨域调用的服务器,不支持自定义标头。如果您另有说明,请使用标题更新您的问题,我可以提供更多帮助。

答案 1 :(得分:0)

这实际上是Parse.com的一个问题。经过一个沮丧的小时后,我遇到了this Google Groups post

相关报价

  

从我的测试中,这从未(客户端或javascript密钥)通过浏览器通过javascript休息交互工作。

     

我实际上在此创建了一个Parse Bug:

     

https://developers.facebook.com/bugs/488204124680438

     

因为我认为这两个密钥都应该通过浏览器工作(不需要使用SDK)。

     

我建议阅读我的错误。我仍然认为正确的实现是使这些密钥能够与浏览器请求一起正常工作,因为如果你在浏览器之外这样做,它就会起作用。

     

但是,唉,他们似乎没有得到这个问题,或者不明白为什么只在浏览器中禁用它没有意义,因为你可以在任何其他平台上使用它而没有问题。只是......不......做......感觉。

我改为使用了我的JavaScript密钥X-Parse-Javascript-Key(根据今天的文档,只适用于他们的JavaScript SDK),它可以作为X-Parse-Client-Key的替代品