【问题标题】:Error using ajax to send JSON data to a private server使用 ajax 将 JSON 数据发送到私有服务器时出错
【发布时间】:2013-03-04 17:39:55
【问题描述】:

我对为 Chrome/Firefox 编写用户脚本非常陌生。我试图从网站获取 AJAX 生成的 JSON 数据并将它们发送到我自己的服务器,以分析它们并将它们放入数据库中。

我设法使用 Ajax 发送数据并将它们放入我自己服务器上的文本文件中。但是在 Chrome 控制台中它说我有:

Uncaught SyntaxError: Unexpected token j

,但我已经收到了每条消息,“数据已发送” 并且我是 “通话后” - 这些是日志消息。

是否有一个回调,我应该实现,还是我遗漏了一些明显的东西?我将我的代码的缩短版本放在这里。

// Injecting javascript in the original page
function inject(func) {
    var source = func.toString();
    var script = document.createElement('script');
    script.innerHTML = "(" + source + ")()";
    document.body.appendChild(script);
}

function injection() {
}

// This function intercepts the ajax
function interceptAjax() {
    $('body').ajaxSuccess (
            function (event, requestData, settings) {
                serverData = requestData.responseText;

                if(JSON.parse(settings.data).method == "dashboard.getPaginatedPlextsV2"){

                console.log("Sending");
                $.ajax({
                    type: "POST",
                    url: "http://mywebsite.com/collectdata.php",
                    data: { json: JSON.stringify(serverData) },
                    success: function(msg) {
                        console.log("Data were sent");
                    },
                    error: function(xhr, ajaxOptions, thrownError) {
                        console.log("Failed: " + xhr.status + " - " + thrownError);
                    }
                });

                console.log("After the call");
                }
            }
    );
}

// A helperfunction for the ajaxInterception to work in Chrome
function addJS_Node (text, s_URL, funcToRun) {
    var D = document;
    var scriptNode = D.createElement('script');
    scriptNode.type = "text/javascript";
    if(text) scriptNode.textContent = text;
    if(s_URL) scriptNode.src = s_URL;
    if(funcToRun) scriptNode.textContent = '(' + funcToRun.toString() + ')()';

    var targ = D.getElementsByTagName('head')[0] || D.body || D.documentElement;
    targ.appendChild(scriptNode);
}

// This function is necessary to intercept the ajax
addJS_Node(null, null, interceptAjax);

inject(injection);

【问题讨论】:

    标签: ajax google-chrome userscripts


    【解决方案1】:

    几件事:

    1. mywebsite.com 是否与目标页面相同的域?如果没有,那么你不能像那样做跨域 AJAX(除非目标页面服务器有一个慷慨的 CORS 策略)。

      如果是这样,那么您可以控制服务器(或有权访问),那么为什么要为数据使用用户脚本呢? ;-)

    2. 这一行:

      if(JSON.parse(settings.data).method == "dashboard.getPaginatedPlextsV2")
      

      看起来容易出错。

    即使您有理由确定页面的所有 AJAX 调用都只发送有效的 JSON 数据,但并非所有数据都具有method 属性。 (例如:看起来对 http://mywebsite.com/collectdata.php 的 AJAX 调用可能没有。

    您需要使该检查更加防撞。像这样的东西(未经测试):

    var jsonData    = null;
    
    try {
        jsonData    = JSON.parse (settings.data);
    }
    catch (e) {
        jsonData    = null;
    }
    
    if (jsonData  &&  jsonData.method
        &&  jsonData.method == "dashboard.getPaginatedPlextsV2"
    ) {
        ...
    

    【讨论】:

    • 目标页面不是同一个域。我设法在那里获取数据,但这个错误让我很困惑,因为显然一切都很好。我会检查一下,是否是因为设置对象。
    • 成功了。我想我现在知道了。这是因为我正在向我的主页发送 AJAX 请求,并且该请求由函数检查。由于我还没有实现 setting.data 它失败了。使用 try-catch 和使用日志,我能够找到问题所在。非常感谢。
    猜你喜欢
    • 1970-01-01
    • 2021-03-22
    • 1970-01-01
    • 2018-05-07
    • 2013-08-13
    • 1970-01-01
    • 1970-01-01
    • 2018-04-17
    • 1970-01-01
    相关资源
    最近更新 更多