浏览器必须发送POST请求并从javascript接收结果html页面。 服务器响应中没有Access-Control-Allow-Origin。服务器无法更改任何内容。
如果人工点击是提交按钮,则会自动返回响应。
使用以下命令从javascript尝试相同:
$.ajax('https://example.com', {
data:
{
postkey: 'value'
}
method: 'POST',
async: false
})
.done(function (data, textStatus, jqXHR) {
alert(data);
})
.fail(function (xhr, textStatus, errorThrown) {
alert(JSON.stringify(xhr));
});
在chrome控制台中返回异常:
No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:52216' is therefore not allowed access.
我也试过jsonp
$.ajax('https://example.com', {
data:
{
postkey: 'value'
}
method: 'POST',
dataType: 'jsonp',
async: false
})
.done(function (data, textStatus, jqXHR) {
alert(data);
})
.fail(function (xhr, textStatus, errorThrown) {
alert(JSON.stringify(xhr));
});
在这种情况下,请求类型更改为GET并且chrome控制台中出现stange错误:
Uncaught SyntaxError: Unexpected token <
Chrome开发者工具显示,在两种情况下,example.com服务器都返回了正确的html:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html lang="et">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta http-equiv="content-language" content="et">
<meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1">
...
如何在客户端修复此问题?我需要模拟单击表单提交按钮并获取结果html页面。
使用Jquery,Bootstrap 3和jquery UI。 在服务器Apache中,使用Mono,mod_mono,ASP .NET MVC 4.6。
可以在服务器中创建MVC控制器来调用这样的请求并返回结果。我正在寻找一种方法来从浏览器中完成它,而无需额外的应用程序自己的服务器调用。
**更新**
从 How do I send a cross-domain POST request via JavaScript? jcubic回答我找到了样本:
还有一种方法(使用html5功能)。您可以使用代理iframe 托管在其他域上,您使用postMessage发送消息 iframe,那iframe可以做POST请求(在同一个域上)和 将postMessage返回到父窗口。
发送者邮箱上的父母
var win = $('iframe')[0].contentWindow;
win.postMessage(JSON.stringify({url: "URL", data: {}}),"http://reciver.com");
function get(event) {
if (event.origin === "http://reciver.com") {
// event.data is response from POST
}
}
if (window.addEventListener){
addEventListener("message", get, false)
} else {
attachEvent("onmessage", get)
}
在reciver.com上iframe
function listener(event) {
if (event.origin === "http://sender.com") {
var data = JSON.parse(event.data);
$.post(data.url, data.data, function(reponse) {
window.parent.postMessage(reponse, "*");
});
}
}
// don't know if we can use jQuery here
if (window.addEventListener){
addEventListener("message", listener, false)
} else {
attachEvent("onmessage", listener)
}
此问题也在http://www.ajax-cross-origin.com/how.html
中描述这适用于当前的浏览器,这是否合理? 是否有一些通用的方法或插件来实现这个?
答案 0 :(得分:0)
除非您拥有要发布的域名,否则您将无法从发起请求的域名发布到其他域名。
答案 1 :(得分:0)
您可以使用AJAX并在PHP脚本端运行curl帖子