XMLHttpRequest响应:预检请求未通过访问控制检查:

时间:2016-11-21 00:50:55

标签: javascript angular xmlhttprequest http-post firebase-cloud-messaging

我正在尝试使用以下http post请求订阅firebase云消息传递主题:

var data = null;

var xhr = new XMLHttpRequest();
xhr.withCredentials = true;

xhr.addEventListener("readystatechange", function () {
  if (this.readyState === 4) {
     console.log(this.responseText);
  }
});

xhr.open("POST",   "https://iid.googleapis.com/iid/v1/etLaB36oW1w...nyO_Zc26ZPOFTeNuf58-l6uSoJ9Xs1JRYKfqxsmKkdrR-oX4tQsuS_z5C0/rel/topics/Byfjordskole");
xhr.setRequestHeader("authorization", "key=AAAABlxTfxY:APA91bGE3sa09zq...dZSIVJul3N-y1hMJqAoKngwjC_El3rEuH4_-S2gOxKcdAF67HHhGK7pAWJrhyt8JthJGm_QN6JdXTBow62nYodgFvLncfSniwtBinBgIPLaKpT");
xhr.setRequestHeader("content-type", "application/json");
xhr.setRequestHeader("cache-control", "no-cache");
xhr.setRequestHeader("postman-token", "a3ce72a5-f8ba-99e4-59d6-fe3295b84f6e");

xhr.send(data);

这在我使用Postman时有效,但当我尝试在我的javascript应用程序上使用相同的代码时,我收到以下错误消息:

XMLHttpRequest cannot load https://iid.googleapis.com/iid/v1/eOEiRqvhD4s:APA91bFFb-uP-Xhf2iD-ALUI_X4M7…gA_YgQgmuib7cCL7UuSdlhUUWmsqwRnkcO2kpAIV_H-_xBPlPd/rel/topics/Eiganesskole. 
Response to preflight request doesn't pass access control check: 
No 'Access-Control-Allow-Origin' header is present on the requested resource. 
Origin 'https://sk......e.top' is therefore not allowed access.

firebase云消息是否阻止我提出此类请求,或者是否有解决此问题的方法?任何帮助将受到高度赞赏。

1 个答案:

答案 0 :(得分:0)

此Stack Overflow回答解决了我的问题:https://stackoverflow.com/a/2067584/6177181

问题是与浏览器安全相关:这使我无法提出跨域请求。解决方案是将我的代码包装在脚本标记中以避免此限制。因此,我只是在index.html文件中添加请求代码而不是从另一个javascript文件执行此请求,而不是:

<script>
function subscribe(currentToken){
"use strict"
  let stored_topics = localStorage.getItem("topicsList");
  let topics = JSON.parse(stored_topics);
  for (let i = 0; i < topics.length; i++){
     let data = null;
     let xhr = new XMLHttpRequest();
     xhr.addEventListener("readystatechange", function () {
     if (this.readyState === 4) {
       console.log(this.responseText);
  }
  });
  let body = {};
    let url = "https://iid.googleapis.com/iid/v1/"+currentToken+"/rel/topics/"+topics[i];
    xhr.open("POST", url);
    xhr.setRequestHeader("authorization", "key=AAAABlxTfxY:....QAVfBJI8J0RdZSIVJul3N-y1hMJqAoKngwjC_El3rEuH4_-S2gOxKcdAF67HHhGK....2nYodgFvLncfSniwtBinBgIPLaKpT");
    xhr.setRequestHeader("content-type", "application/json");
    xhr.send(data);
   }
  }
</script>

(在同一文件(index.html)中从firebase云消息传递API请求currentToken)。 按照此链接上的说明操作:https://firebase.google.com/docs/cloud-messaging/js/receive,了解有关Firebase云消息传递的信息。