为什么我得到一个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等标题)
该选项是从http://www.w3.org/TR/cors/见http://metajack.im/2010/01/19/crossdomain-ajax-for-xmpp-http-binding-made-easy/ for多一点信息
我不相信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" }); }