我正在通过jQuery的$.ajax函数调用一个第三方API。但是,当我进行调用时,会出现以下错误:XMLHttpRequest无法加载http://the-url.com. 请求已重定向到'http://the-url.com/anotherlocation,这不允许用于需要飞行前的跨源请求。
我从这篇文章中看到,这可能是一个Webkit错误,所以我在Firefox(我正在Chrome中开发)中尝试了它,得到了相同的结果。我在Chrome和Firefox上尝试过,得到了相同的结果
在本文中,我还尝试使用jsonp,方法是将$.ajax函数的crossDomain属性设置为true,并将dataType设置为jsonp。但是,这导致了一个500内部服务器错误
当我使用–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
关于你的第一个问题
我可以做些什么来提出这个跨域请求
以下请求头首先发送到服务器。基于响应头,UserAgent(此处的浏览器)将丢弃响应(如果有),并且在头不加时不会将其返回给XHR回调
来源:http://yourdomain.com
访问控制请求方法:POST
访问控制请求标头:X-Custom-Header
然后,服务器应使用以下标题进行响应:
访问控制允许原点:http://yourdomain.com
访问控制允许方法:GET、POST、OPTIONS
访问控制允许标头:X-Custom-Header
举例如下:https://stackoverflow.com/a/8689332/1304559
您可以使用诸如Fiddler或Web Inspector网络选项卡(Chrome)或Firebug的网络选项卡之类的工具来查找服务器响应您的请求而发送回的头
第三方API服务器url应使用支持的值进行响应。如果没有,那就是你的问题
在JSONP500服务器错误方面没有多大帮助,正如它所说的内部服务器错误
更新
我看到了你的屏幕截图,这里有几点值得注意
- 使用了HTTP POST
- 在两种响应模式中均未找到
访问控制标题。第二个状态代码为302 Origin请求头是null,因此我相信HTML文件是从文件系统打开的,而不是从网站打开的
启用JSONP
说到JSONP不工作的原因,原因是(指定的ASMX的)web服务配置没有为请求启用GET模式。JSONP不适用于POST
为什么200禁用了安全功能?
直接调用POST请求时,不会在它之前触发任何选项或飞行前请求,所以服务器只需做出响应
为什么302启用安全性的状态代码?
首先,我们将简要介绍未禁用安全标志(默认)时的情况。选项请求被激发到URL。URL应回复可使用的HTTP方法列表,即GET、POST等。此选项请求的状态代码应为200
在当前情况下,执行此操作时会调用重定向。重定向指向HTTP服务器错误的自定义错误处理程序。我相信这是404错误,正在被捕获并重定向。[这可能是因为自定义处理程序设置为ResponseRedirect而不是responsewrite。404的原因是未启用跨域访问
如果关闭了自定义错误处理,则会返回HTTP500code。我相信在触发跨域请求后立即检查服务器日志可以发现问题。如果有其他错误,最好检查服务器日志
可能的解决方案
要启用访问,有两种方法-此处详述。或者直接将访问控制标题添加到web.config文件的customheaders部分
启用跨域访问时,服务器应响应选项并允许请求通过。除非有其他错误,否则应该返回HTTP 200。但是ajax回调将无法访问响应。只有当Access Control Allow Origin设置为“*”或Origin请求头值,并且根据需要Access Control时,才可以执行此操作。ajax回调将按预期接收响应
第三点,null原点。如果Origin请求标头值作为访问控制允许Origin返回,则这将是一个问题。但我假设您将把HTML页面移动到web服务器上,所以这不应该是一个问题
希望这有帮助