0

我正在手动构建一些 XML 以发布到我们的服务器,我已经验证了 XML,它是有效的并且没有错误。

这是我的帖子:

$.ajax({
    type: 'POST',
    url: submitUrl,
    data: xmlString,
    dataType: 'text',
    beforeSend:function() {
        console.log(submitUrl);
    },
    success:function(data) {
        console.log(data);
    },
    error:function(error) {
        console.log(error);
    }
}); 

var xmlString是一个包含 XML 的文本字符串,遗憾的是我不能公开发布它,但本质上它看起来像:

var xmlString = '<?xml version="1.0" encoding="utf-8"?> ... '

代码在网络服务器上运行,而不是在本地运行,但我似乎得到的是:

XMLHttpRequest cannot load <URL>. Origin <URL> is not allowed by Access-Control-Allow-Origin. 

但是服务器是打开的,没有锁定到这些类型的请求,所以帖子应该可以通过,但是我每次都会收到上述消息。

有什么想法,我可以尝试的事情,我可以获得更好的调试消息的方法吗?

4

1 回答 1

2

您的代码实际上是在尝试发出跨域 (CORS) 请求,而不是普通的 POST。

现代浏览器只允许 Ajax 调用与源 HTML 页面位于同一域中的页面。

换句话说,只要尝试发出 Ajax 请求的 HTML 页面与目标 URL 不在同一个域中,浏览器就不会发出调用(如您所料)。相反,它将尝试发出 CORS 请求。

你说:

(...)服务器是开放的,没有锁定这些类型的请求(...)

更好地调试它:查看页面和服务器之间正在进行的网络事务(发送请求和接收响应)。(在 Chrome 中,它是 F12 + Networktab。)如果您仔细观察,POST则永远不会发送。相反,OPTIONS请求是。浏览器期望响应包含一个Access-Control-Allow-Origin标头,其中包含部署 HTML 页面的域 URL。对 的响应OPTIONS没有出现或没有这些标头。然后,您的浏览器会得出结论,不允许此类访问,因此会出现错误。

有关 CORS 的更多信息:

跨域资源共享 (CORS) 1是一种允许网页XMLHttpRequests访问另一个域的机制。由于同源安全策略,否则此类“跨域”请求将被 Web 浏览器禁止。

简而言之,要执行 CORS 请求,您的浏览器:

  • 将首先向目标 URL 发送OPTION请求
  • 然后,只有当服务器对其的响应OPTION包含足够的标头(Access-Control-Allow-Origin其中之一)以允许 CORS 请求时,浏览器才会执行调用(几乎与 HTML 页面位于同一域中的方式完全相同)。
    • 如果没有出现预期的标题,浏览器就会放弃(就像它对你所做的那样)。

如何解决?最简单的方法是在服务器上启用 CORS(启用必要的标头)。如果您没有服务器端访问权限,您可以从其他地方镜像 Web 服务,然后在此处启用 CORS。

于 2013-06-02T01:00:08.990 回答