为什么我得到一个OPTIONS请求,而不是一个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执行一个OPTIONS请求,然后该callback将永远不会被调用。

当它不是跨域时,它工作正常。

不应该jQuery只是调用一个<script>节点,然后做它的加载时的callback? 我明白,我将无法得到结果(因为它是跨域),但没关系; 我只是想要通话。 这是一个错误,还是我做错了什么?

据MDN介绍 ,

预冲的请求

与上面讨论的简单请求不同,“preflighted”请求首先向另一个域上的资源发送HTTP OPTIONS请求头,以确定实际的请求是否安全发送。 跨站点请求是这样预先考虑的,因为它们可能会影响用户数据。 特别是,如果出现以下情况,则会请求一个请求:

  • 它使用GET或POST以外的方法。 另外,如果使用POST来发送具有除application / x-www-form-urlencoded,multipart / form-data或text / plain之外的Content-Type的请求数据,例如,如果POST请求将XML有效载荷发送到服务器使用application / xml或text / xml,那么请求是预冲的。
  • 它在请求中设置自定义标题(例如,请求使用X-PINGOTHER等标题)

我不相信jQuery自然会在给出这样一个URL的时候自然地做一个JSONP请求。 但是,当您告诉它用于callback的参数时,会执行JSONP请求:

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

这完全取决于接收脚本使用该参数(不必称为“jsoncallback”),所以在这种情况下,函数将永远不会被调用。 但是,既然你说你只是想在metaward.com脚本执行,这将使它。

只需将“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, }); 

它看起来像Firefox和Opera(在Mac上testing),不喜欢这个跨域(但Safari浏览器很好)。

您可能需要调用本地服务器端代码来curl远程页面。

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

唯一的解决方法是callback。 这是:创build一个新的脚本对象,并将src指向端点JavaScript,这是一个带有JSON值的callback函数(myFunction({data})),myFunction是一个函数,用于处理数据在一个variables中)。

如果你正在尝试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" }); }