Dojo无法提出CORS请求。 jQuery可以

时间:2014-01-27 04:45:11

标签: ajax dojo xmlhttprequest cors

我已经设置了一个dojo模块来处理我的沟通:

define(["dojo/request/xhr", "dojo/json"],
  function(xhr, JSON) {

  return {
    getJson: function(url) {
      return xhr.get(url, {handleAs:'json', headers: {"X-Requested-With": ""}});
    },
    postJson: function(url, postData) {
      return xhr(url, {
        method: 'POST',
        handleAs: "json",
        data: JSON.stringify(postData),
        headers: {"X-Requested-With": "", "Content-Type":"application/json"}
      })
    },
    getSecure: function(url, token) {
      return xhr.get(url, {handleAs:'json', headers: {"X-AUTH": token, "X-Requested-With": "", "Content-Type":"application/json" }});
    },
    postSecure: function(url, postData, token) {
      return xhr(url, {
        method: 'POST',
        handleAs: 'json',
        data: JSON.stringify(postData),
        headers: {"X-Requested-With": "", "Content-Type":"application/json", "X-AUTH": token}
      });
    }
  };

});

发送请求时,OPTIONS几乎立即失败。我在Postman中尝试了这个请求,以确保API活得很好。然后我得到一头狂野的头发并在jQuery中构建了一个快速测试:

$.ajax({
  url: 'https://someurl.url/auth/get_token',
  type: 'post',
  data: JSON.stringify({username:"user", password:"pass"}),
  contentType: 'application/json',
  dataType: 'json' ,
  xhrFields: {
    withCredentials: false
  },
  success: function(json) {
    console.log(json);
    $.ajax({
      url: 'https://someurl.url/api/service/' + json.results.somevalue,
      type: 'GET',
      headers: { 'X-AUTH': json.results.token },
      contentType: 'application/json; charset=utf-8',
      dataType: 'json' ,
      success: function(json) {
        console.log(json);

      },
      error: function (XMLHttpRequest, textStatus, errorThrown) {
        console.log("error :"+XMLHttpRequest.responseText);
      }


    });

  },
  error: function (XMLHttpRequest, textStatus, errorThrown) {
    console.log("error :"+XMLHttpRequest.responseText);
  }

这很好用。我知道Dojo在大约一年前遇到了问题,并发送了“X-Requested-width”标题,但是我已经把它排除在外并且它没有尝试发送它。我正在拉我的头发,因为我真的不想将jQuery作为依赖我的应用程序而仅仅是为了发出Web请求。道场应该能够做到这一点。任何Dojo人都知道如何使这项工作?

4 个答案:

答案 0 :(得分:2)

空字符串与null不同。您需要将X-Requested-With设置为null,而不是"",以避免预检请求。它应该没关系,除非你的服务器没有响应允许X-Requested-With标头,因为你总是发送一个自定义标头,它总是会触发预检。

答案 1 :(得分:2)

我在dojo.xhrGet和' Content-Type':' application / json'是问题。我不得不改变它,假装我正在恢复纯文本,因为它实际上是跨域工作的,因此:

dojo.xhrGet({
    url: url,
    headers: {
        'X-Requested-With': null,
        'Content-Type': 'text/plain'
    },
    load: function(responseText) {
        var results = JSON.parse(responseText);
    ...
    }
});

之后它跨域工作,并将结果视为JSON对象。

答案 2 :(得分:0)

          var syncCall = true;
          if(dojo.isFF)
            syncCall = false;
          xhr(url, { 
            method : 'GET',
            handleAs : 'json',
            withCredentials : true,
            sync  :  syncCall,
            headers : {
              'X-XSRF-Token' : settings.XSRF_TOKEN,
              'Content-Type' : 'application/json'
            }

答案 3 :(得分:0)

您可以简单地使用dojo / request / xhr模块发出任何HTTP请求,如OPTIONS,GET,PUT,DELETE,CONNECT,PUT,HEAD,TRACE等。

将http方法名称作为字符串(全部以大写字母)传递,如下所示,

foreach($email as $id => $to) {
    Update Database here
    $message->addTo($to);
    $mailSending();
}