使用动态脚本加载JSON数据 - 跨域 - CORS不可用

时间:2013-07-02 20:51:23

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

我正在运行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:意外的令牌:

我应该如何进行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来获取数据,但也遇到了安全问题。

谢谢,

克里斯

2 个答案:

答案 0 :(得分:1)

根据我在Calgary 上使用JSON Web服务插件的经验,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 /果冻制作此列表。

答案 1 :(得分:0)

您可以尝试使用$.ajax({});代替$.getSrript();来执行跨域$.ajax({url: "your_url.php",dataType; "jsonp",success: function(data){ document.write(data);} });