我正在通过jQuery的$ .ajax函数使用的第三方API上调用POST。但是,当我拨打电话时,出现以下错误:XMLHttpRequest cannot load http://the-url.com. The request was redirected to 'http://the- url.com/anotherlocation', which is disallowed for cross-origin requests that require preflight.
XMLHttpRequest cannot load http://the-url.com. The request was redirected to 'http://the- url.com/anotherlocation', which is disallowed for cross-origin requests that require preflight.
我从这篇文章中看到这可能是Webkit的错误,所以我在Firefox中尝试了此操作(我正在使用Chrome开发),并且得到了相同的结果。
在这篇文章中,我还尝试通过将crossDomain$.ajax函数的属性true设置为并将设置为dataType来使用jsonpjsonp。但是,这导致了500个内部服务器错误。
crossDomain
true
dataType
jsonp
当我使用–disable-web-security标志启动Chrome时,我没有任何问题。但是,如果我正常启动浏览器,则会收到错误消息。
因此,我想这可能是一个分为两部分的问题。我该怎么做才能提出此跨域请求?如果答案是JSONP,那么我该如何确定是否正确设置了第三方API来支持此功能?
编辑: 这是我在禁用浏览器安全性的情况下拨打电话时的屏幕截图:https : //drive.google.com/file/d/0Bzo7loNBQcmjUjk5YWNWLXM2SVE/edit?usp=sharing
在启用了浏览器安全性的情况下拨打电话时,这是屏幕托管程序(如正常):https ://drive.google.com/file/d/0Bzo7loNBQcmjam5NQ3BKWUluRE0/edit?usp=sharing
我想出的解决方案是使用cURL(如@waki所提到的),但是使用了稍作修改的版本来支持SOAP。然后,我对本地PHP文件进行了调用,而不是对第三方API(配置不正确)进行AJAX调用,然后对本地API文件进行了SOAP调用,并将数据传递回我的PHP文件中,然后处理它。这使我忘记了CORS及其相关的所有复杂性。这是代码(从该问题中获取和修改的,但未进行身份验证)。
$post_data = "Some xml here"; $soapUrl = "http://yoursite.com/soap.asmx"; // asmx URL of WSDL $headers = array( "Content-type: text/xml;charset=\"utf-8\"", "Accept: text/xml", "Cache-Control: no-cache", "Pragma: no-cache", "SOAPAction: http://yoursite.com/SOAPAction", "Content-length: " . strlen($post_data), ); //SOAPAction: your op URL $url = $soapUrl; // PHP cURL $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data); // the SOAP request curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); $response = curl_exec($ch); /* Check for an error when processing the request. */ if(curl_errno($ch) != 0) { // TODO handle the error } curl_close($ch); // TODO Parse and process the $response variable (returned as XML)