我已经设置了一个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人都知道如何使这项工作?
答案 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();
}