3

我正在努力实现 CORS,以便我的 Ember 应用程序可以与另一台服务器上的 API 通信。我需要发送两个请求:通过 POST 的身份验证请求,然后向 API 端点之一发送 GET 请求。

这两个请求都启动了预检请求。身份验证预检请求运行良好。然后,当我向 API 运行请求时,预检请求会挂起。Chrome 将状态和类型显示为“待处理”,并且请求永远不会完成。

这是验证码。我在这里使用 jQuery 1.10.2。

  $.ajax({
    type: 'POST',
    url: 'https://blahblahblah.edu/AstraDev/Logon.ashx',
    data: "{username: '', password: ''}",
    contentType: 'text/json',

    xhrFields: {
      withCredentials: false 
    },

    headers: {
    },

    success: function(response) {
      console.log(response);
    },

    error: function(response) {
      console.log(response);
    }
  });

API GET 请求的代码非常相似

  $.ajax({
    type: 'GET',
    url: 'https://blahblahblah.edu/AstraDev/~api/query/room',
    data: {fields: "Id"},
    contentType: 'application/json; charset=utf-8',
    xhrFields: {
      withCredentials: true 
    },
    headers: {
    },
    success: function(response) {
      console.log(response)
    },
    error: function(response) {
      console.log(response)
    }
  });

如果我将 GET 的内容类型更改为不预检的内容(如“text/plain”),请求将失败。但是,如果我做任何预检,预检就会挂起。

这是相关的服务器配置。我正在使用 IIS 7.5。

<httpProtocol>
     <customHeaders>
       <add name="Access-Control-Allow-Origin" value="http://localhost:8888" />
       <add name="Access-Control-Allow-Methods" value="GET,POST,OPTIONS" />
       <add name="Access-Control-Allow-Headers" value="Content-Type" />
       <add name="Access-Control-Allow-Credentials" value="true" />
    </customHeaders>
</httpProtocol>

CORS对我来说很新。所以也许我错过了一些明显的东西。有任何想法吗?谢谢。

4

1 回答 1

1

没有看到响应标头可能有多种原因。但这是我在处理 PreFlight 问题时发现的。这是一个在预检后处理 json 正文的 JavaScript 示例。初始 xhr.open 对 teamviewer 服务器进行预检。您只需发送满足预检要求的最少请求标头。预检通过时会发送 json 正文。

 function createsession(groupid, meetwith) {

   var xhr = new XMLHttpRequest();
   var url = 'https://webapi.teamviewer.com/api/v1/sessions';
   var jbody = JSON.stringify({"groupid": groupid,
                               "description": "Global Manager Intervention",
                               "end_customer": { "name": "" + meetwith + "" }
                            });

   callTVAPI();

   function callTVAPI() {
      if (xhr) {
         xhr.open('POST', url, true);
         xhr.setRequestHeader('Content-Type', 'application/json');
         xhr.setRequestHeader('Authorization', 'Bearer @(ViewBag.TeamViewerToken)');
         xhr.onreadystatechange = function () {
            if (xhr.readyState !== XMLHttpRequest.DONE) {
                return;
            }
            if (xhr.status !== 200) {
                return;
            }
        
           var data = jQuery.parseJSON(xhr.response);
           alertify.success("Launching: " + data.supporter_link);
           
     };
     xhr.send(jbody);
   }
  }
 }

于 2016-02-24T21:50:51.570 回答