【问题标题】:How to post to other domain and get result html in javascript如何发布到其他域并在 javascript 中获取结果 html
【发布时间】:2016-12-20 19:46:01
【问题描述】:

浏览器必须发送 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 回复到父窗口。

sender.com 上的父级

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中也有描述

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

【问题讨论】:

    标签: javascript jquery html asp.net ajax


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      除非您拥有要发布到的域,否则您将无法发布到与发起请求的域不同的域。

      【讨论】:

      • 如果有常规表单和人工点击提交按钮,它可以工作。也许可以创建隐藏表单或使用 iframe 来获取 javascript 中的结果?我可以在我的服务器中创建发出此类请求的 MVC 控制器,但我正在寻找一种直接从浏览器调用 example.com 的方法,而无需对我的服务器进行额外调用
      • 是的。第一个示例异常发生在 XMLHttp send() 方法中。它像浏览器一样抛出异常并且不返回数据。对于第二种方法,控制台不显示导致错误的代码。不确定是什么原因造成的。我用可能的解决方案更新了问题。这合理吗,行得通吗?
      • JSONP 仅在您发布到支持它的站点时才有效,这意味着将结果包装到 JS 函数调用中。对于那个 iframe 解决方案,它也只有在您控制网站时才有效,但在这种情况下,启用 CORS 似乎不那么麻烦。
      猜你喜欢
      • 2021-06-22
      • 1970-01-01
      • 2023-01-22
      • 2014-02-23
      • 1970-01-01
      • 2019-02-09
      • 2016-10-13
      • 1970-01-01
      相关资源
      最近更新 更多