我正在手动构建一些 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.
但是,服务器是开放的,并未锁定这些类型的请求,因此该帖子应该可以通过,但我每次都会收到上述消息。
有什么想法,我可以尝试的事情,我可以获得更好的调试消息的方法吗?
最佳答案
您的代码实际上是在尝试发出跨域 (CORS) 请求,而不是普通的 POST。
现代浏览器只允许 Ajax 调用与源 HTML 页面同一域中的页面。
换句话说,只要尝试发出 Ajax 请求的 HTML 页面与目标 URL 不在同一域中,浏览器就不会进行调用(正如您所期望的那样)。相反,它会尝试发出 CORS 请求。
你说:
(...) the server is open not locked down to these types of requests (...)
更好地调试:查看页面和服务器之间进行的网络事务(发送请求和接收响应)。 (在 Chrome 中,它是 F12 + Network
选项卡。)如果仔细观察,POST
永远不会发送。相反,OPTIONS
请求是。浏览器期望响应包含 Access-Control-Allow-Origin
header 以及部署 HTML 页面的域 URL。OPTIONS
的响应不会出现或者没有这些标题。然后,您的浏览器会断定不允许此类访问,从而出现错误。
有关 CORS 的更多信息:
跨源资源共享 (CORS) 1是一种允许网页向另一个域发出 XMLHttpRequest
的机制。由于 same origin security policy 否则,此类“跨域”请求将被 Web 浏览器禁止。 。
简单来说,要执行 CORS 请求,您的浏览器:
- 首先会向目标网址发送
OPTION
请求 - 然后仅当服务器对该
OPTION
的响应包含 adequate headers (Access-Control-Allow-Origin
is one of them)为了允许 CORS 请求,浏览器将执行调用(几乎与 HTML 页面位于同一域时的方式完全相同)。- 如果预期的 header 没有出现,浏览器就会放弃(就像它对您所做的那样)。
如何解决?最简单的方法是在服务器上启用 CORS(启用必要的 header )。如果您没有服务器端访问权限,您可以从其他地方镜像 Web 服务,然后在那里启用 CORS。
关于javascript - jQuery - POST XML 字符串到服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16878764/