为什么我得到的是选项请求而不是 GET 请求?

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.js" type="text/javascript"></script>
<script>
$.get("http://example.com/", function(data) {
alert(data);
});
</script>

它会对该 URL 执行一个 OPTION 请求,然后回调函数就不会被任何东西调用。

当它不是跨域时,它工作得很好。

JQuery 是否应该使用 <script>节点进行调用,然后在加载时进行回调?我知道我不能得到结果(因为它是跨域的) ,但是没关系; 我只是想让调用通过。这是一个错误,还是我做错了什么?

411076 次浏览

看起来Firefox和Opera(在mac上也测试过)不喜欢这种交叉域(但Safari没问题)。

您可能必须调用本地服务器端代码来压缩远程页面。

事实上,由于安全原因,跨域AJAX (XMLHttp)请求是不允许的(考虑一下从客户端获取一个“受限”的网页并将其发送回服务器——这将是一个安全问题)。

唯一的解决方法是回调。这是:创建一个新的脚本对象,并将src指向端JavaScript,这是一个带有JSON值的回调(myFunction({data}), myFunction是一个对数据做一些事情的函数(例如,将其存储在变量中)。

我不相信jQuery会在给定URL时自然地执行JSONP请求。然而,当你告诉它回调使用什么参数时,它会做一个JSONP请求:

$.get("http://metaward.com/import/http://metaward.com/u/ptarjan?jsoncallback=?", function(data) {
alert(data);
});

完全由接收脚本来使用该参数(不一定要称为“jsoncallback”),因此在这种情况下,函数将永远不会被调用。但是,因为你说你只是想在metaward.com脚本执行,这将使它。

根据中数

起飞前的请求

不像简单的请求(上面讨论过),“预飞行”请求先 发送一个HTTP OPTIONS请求头到另一个资源 域,以确定实际请求是否安全 发送。跨站点请求是这样预飞行的,因为它们可能 对用户数据有影响。具体来说,请求是 起飞前的如果:< / p >
  • 使用GET和POST以外的方法。同样,如果使用POST发送 请求内容类型不是的数据 Application /x-www-form-urlencoded, multipart/form-data,或text/plain, 例如,如果POST请求发送一个XML有效负载到服务器使用 Application /xml或text/xml,那么请求将被预飞。李< / >
  • 它在请求中设置自定义报头(例如,请求使用诸如 李X-PINGOTHER) < / >

如果你试图POST

确保JSON.stringify你的表单数据并作为text/plain发送。

<form id="my-form" onSubmit="return postMyFormData();">
<input type="text" name="name" placeholder="Your Name" required>
<input type="email" name="email" placeholder="Your Email" required>
<input type="submit" value="Submit My Form">
</form>

function postMyFormData() {


var formData = $('#my-form').serializeArray();
formData = formData.reduce(function(obj, item) {
obj[item.name] = item.value;
return obj;
}, {});
formData = JSON.stringify(formData);


$.ajax({
type: "POST",
url: "https://website.com/path",
data: formData,
success: function() { ... },
dataType: "text",
contentType : "text/plain"
});
}

只需将“application/json”更改为“text/plain”,不要忘记json .stringify(request):

var request = {Company: sapws.dbName, UserName: username, Password: userpass};
console.log(request);
$.ajax({
type: "POST",
url: this.wsUrl + "/Login",
contentType: "text/plain",
data: JSON.stringify(request),


crossDomain: true,
});

我也有同样的问题。我的修复是添加头到我的PHP脚本,只有在开发环境中才会出现。

这允许跨域请求:

header("Access-Control-Allow-Origin: *");

这告诉preflight请求,客户端可以发送任何它想要的头文件:

header("Access-Control-Allow-Headers: *");

这样就不需要修改请求了。

如果您的开发数据库中有可能泄露的敏感数据,那么您可能要三思。

在我的例子中,这个问题与CORS无关,因为我正在向同一个web服务器发出jQuery POST。数据是JSON,但我省略了dataType: ' JSON '参数。

正如上面David Lopes的回答所示,我没有(也没有添加)contentType参数。

我能够修复它与以下头的帮助

Access-Control-Allow-Origin
Access-Control-Allow-Headers
Access-Control-Allow-Credentials
Access-Control-Allow-Methods

如果你使用的是Nodejs,下面是你可以复制/粘贴的代码。

app.use((req, res, next) => {
res.header('Access-Control-Allow-Origin','*');
res.header('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept');
res.header('Access-Control-Allow-Credentials', true);
res.header('Access-Control-Allow-Methods', 'GET, POST, PUT, PATCH');
next();
});