如何发布到其他域并在JavaScript中获取结果html

时间:2016-08-14 09:36:36

标签: javascript jquery html asp.net ajax

浏览器必须发送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

中描述

这适用于当前的浏览器,这是否合理? 是否有一些通用的方法或插件来实现这个?

2 个答案:

答案 0 :(得分:0)

除非您拥有要发布的域名,否则您将无法从发起请求的域名发布到其他域名。

答案 1 :(得分:0)

您可以使用AJAX并在PHP脚本端运行curl帖子