【问题标题】:Using Dynamic Scripts to load JSON Data - Cross Domain - CORS not available使用动态脚本加载 JSON 数据 - 跨域 - CORS 不可用
【发布时间】:2013-06-30 09:57:59
【问题描述】:

我有一个正在运行的 ServiceNow 实例,我正在尝试使用 JSON 库拉取所有用户。如果我输入转储此数据的 URL,我可以轻松查看 JSON 用户列表,我正在尝试创建一个网页,该网页将获取此 JSON 列表并从中列出用户列表。我不断遇到跨域问题,CORS 无法使用,因此我试图根据用户的信息动态加载脚本。这是我正在尝试使用的代码。

        function test() {
        var username = document.getElementById("username").value;
        var password = document.getElementById("password").value;
        var domain = document.getElementById("domain").value;
        var targeturl = "https://" + username + ":" + password + "@"
            + domain + "/sys_user_list.do?JSON&sysparm_action=getRecords";
        $.getScript(targeturl + "&callback=dumpData")
        function dumpData(data) {
            alert(data);
        }
    }

此时脚本似乎可以正常加载,但会导致语法错误。

Uncaught SyntaxError: Unexpected token :

我应该如何调用 getScript 以便获取我的 JSON 数据?这甚至是一种有效的方法吗,我在试图解决这个问题时偶然发现了它,这似乎是我唯一的选择。我试过YQL,但是不行。

编辑:

我已经重做了代码以使用 $.ajax,这里是代码

            $.ajax({
            url: 'https://' + username + ':' + password + "@" + domain + '/sys_user_list.do?JSON&sysparm_action=getRecords&callback=test',
            type: "GET",  
            success: function (data) {
                alert("hello");
            },
            crossDomain: true,
            dataType: "jsonp",
            jsonpCallback: 'test'
        });
        function test(data) {
            alert("It worked!");
        }

我已经搜索了所有与此相关的帖子,但仍然无法弄清楚这一点。有人对如何纠正这种情况有任何建议吗?它仍然给出无效的语法错误。是不是无法获取这个 JSON 数据?

我也尝试过 YQL 来获取数据,但也遇到了安全问题。

谢谢,

克里斯

【问题讨论】:

  • 你试过在$.getScript()之前定义回调吗?
  • 看起来您正在尝试使用 JSONP,是的,这应该是一个有效的方法。我认为您的语法不太正确 - 在 jQuery 文档中查找 .getJSON
  • 如果我使用 .getJSON 则会出现跨域错误。
  • 考虑 JS 或 JSON 文件中的不可见字符。stackoverflow.com/questions/12719859/…

标签: javascript jquery cross-domain access-control servicenow


【解决方案1】:

根据我使用 JSON Web Services 插件在卡尔加里的经验,ServiceNow 不支持 JSONP,仅支持 JSON。

您可能需要构建一个自定义脚本化 Web 服务来获得正确的格式。我也没有看到 JSONP 在都柏林出现。

链接示例: https://<instance>.service-now.com/<table>.do?JSON&sysparm_action=getRecords&displayvalue=true

displayvalue=true 将 sys_id 的参考字段替换为对人类友好的替代方案。

要访问数据结构,很简单:

function callMe() {

  $.getJSON('url.json', function(myData) {

    for (n = 0; n < myData.records.length; n++) {
      console.log(myData.records[n].<column1> + '\n' +
                myData.records[n].<column2> + '\n' +
                myData.records[n].<column3> + '\n' +
                myData.records[n].<column4> + '\n\n'
               );
    }
  });
};

您最好使用 CMS/jelly 来制作此列表。

【讨论】:

  • 你的链接好像坏了
【解决方案2】:

也许你应该尝试$.ajax({}); 而不是$.getSrript(); 来做跨域例如$.ajax({url: "your_url.php",dataType; "jsonp",success: function(data){ document.write(data);} });

【讨论】:

  • 所以我尝试了你的建议,我们似乎更接近了,但现在我有两个稍微不同的问题。我一直遇到语法错误,由于某种原因,它不喜欢我的用户名和密码之间的 :。如果我对 url 进行编码,它会尝试通过添加 localhost 来连接到服务器,然后添加我试图点击的链接。但是,如果我将我的 url 作为一个字符串输入,我会收到一个 mime 类型错误。
  • 嗯,这就像变成另一个未知的错误,你确定你输入的准确url?或者问题可能来自您的服务器xml file。你应该尝试做一些研究!
  • 我已经翻阅了很多与此错误相关的帖子,他们似乎都推荐了同样的东西,但它不起作用。 :(
  • 这意味着它来自您试图从中获取响应的实际 url 中的 xml 文件。您在页面上使用 UTF-8 吗?
  • 是的,使用 UTF-8。另一件事是我得到的是一个 JSON 对象。不是 XML。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-02-03
  • 2015-02-20
  • 1970-01-01
  • 2019-09-16
  • 1970-01-01
  • 2013-06-17
  • 1970-01-01
相关资源
最近更新 更多