【问题标题】:Can access remote json component through browser, but not programmatically through $.getJSON()可以通过浏览器访问远程 json 组件,但不能通过 $.getJSON() 以编程方式访问
【发布时间】:2013-10-12 12:24:45
【问题描述】:

我已经为解决这个问题奋斗了 3 天,并且出现“谷歌超载”问题 - 请提供帮助。

我们有一个位于http://jenkinsBuild.mycompany.com:8080 的 Jenkins 构建服务器,所以如果我在浏览器中输入这个 url...

http://jenkinsBuild.mycompany.com:8080/view/my_view/job/build_me/123/api/json?tree=result

...浏览器页面返回显示...

{"result":"SUCCESS"}

现在,根据Jenkins Wiki,“Jenkins 为其功能提供机器消耗的远程访问 API”通过 REST API 支持 json 和 jsonp,我认为这应该规避任何同源策略问题。

我正在尝试(使用最新的 Chrome 浏览器)获取相同的 json 组件 {"result":"SUCCESS"}

我正在使用带有$.getJSON() 调用的HTML/javascript,如下所述。 HTML 文件目前驻留在我的本地计算机上,但最终可能会驻留在 wiki 上。三个 url 的控制台输出列在代码之后。

如何在浏览器中直接输入 url 得到相同的 json 结果?感谢您的帮助。

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js" type="text/javascript"></script>
<script type="text/javascript">
$(document).ready(function(){
    var url1 = "http://jenkinsBuild.mycompany.com:8080/view/my_view/job/build_me/123/api/json?tree=result";
    var url2 = "http://jenkinsBuild.mycompany.com:8080/view/my_view/job/build_me/123/api/json?tree=result&callback=?";
    var url3 = "http://jenkinsBuild.mycompany.com:8080/view/my_view/job/build_me/123/api/json?callback=?&tree=result";

    $('button').click(function(){
        $.getJSON(url1, function(json) {
            $("#reply").append("got callback: " + json);    
        });
    });
});
</script>

</head>
<body>

<button>Get Jenkins</button><br />

<div id="reply">

</div>

</body></html>

三个 URL 的控制台输出...

url1 -&gt; XMLHttpRequest cannot load @987654322@. Origin null is not allowed by Access-Control-Allow-Origin.

url2 -&gt; Uncaught SyntaxError: Unexpected token : json:1

url3 -&gt; Uncaught SyntaxError: Unexpected token : json:1

【问题讨论】:

  • 您可能遇到了同源问题。如果访问页面的 URL 与 Jenkins 服务器的域或端口号不同,浏览器将不允许。
  • 感谢您的 cmets 并回答所有问题,但我很确定可以在这里做我想做的事情,因为 Jenkins REST API 使 JSONP 能够绕过同源政策。关于我应该如何在我的脚本中指定回调函数以及我调用 $.getJSON 的 URL 有一个详细的第二个答案(下面有 cmets) - 有人删除了吗?我想留在这里,因为它暗示了与上面可能重复的链接不同的东西 - 谢谢。
  • 我根据 user2736012 的 cmets 更正了我的答案并取消了删除。
  • 您需要使用您的开发者控制台查看请求/响应并查看响应的内容。因为在发出 JSONP 请求时它是一个 SyntaxError,所以发送的响应很可能没有正确格式化为 JSONP。

标签: javascript json rest jenkins jsonp


【解决方案1】:

更新:

Url1 不是有效的 jsonp 调用,因为它没有指定回调。不知道为什么 url2 和 url3 失败。

这里有另一种方法尝试手动指定回调函数名称:

var url2 = "http://jenkinsBuild.mycompany.com:8080/view/my_view/job/build_me/123/api/json?tree=result&callback=my_local_javascript_function";

其中 my_local_javascript_function 是调用浏览器上 javascript 代码中的一个函数。将会发生的是,服务器将使用如下所示的脚本进行响应:

my_local_javascript_function({ //json object in here });

该功能需要在您的本地浏览器上可用,然后才能运行。有关 JSONP 的更多信息,请参阅此处:http://en.wikipedia.org/wiki/JSONP

【讨论】:

  • 问号为什么会失败? OP 似乎更有可能返回 JSON 格式而不是 JSONP 格式。
  • 问号表示查询字符串的开始。他现在有两个问号。 '?tree=result&callback=?'这是行不通的。
  • 它会起作用,而且它肯定不会导致 SyntaxError 任何一种方式。无论如何,jQuery 使用它作为 JSONP 的指示符,并将 ? 替换为函数名称。
  • @user2736012 - 你是对的。我已经更新了我的答案以删除不正确的建议,并提供了另一种手动命名回调的方法。
  • 感谢您的建议@manishie - 尽管它没有解决问题,但我已经给了你尝试的勾号 - 我怀疑詹金斯不再做 jsonp 了吗?烦人的是,我可以通过在浏览器中输入几十个 url 并手动切片和切分返回的 json 信息来了解我需要的关于 Jenkins 构建的所有信息,以说明哪些构建已经运行/通过/失败等,但我不能在javascript中以编程方式。一个有趣的练习,但浪费了一个长周末!感谢您的帮助。
【解决方案2】:

ajax 调用遵循same origin policy,因此两个文档需要位于同一个域中 - 不是您的情况,因为发出调用的页面位于您的本地计算机上。

【讨论】:

    猜你喜欢
    • 2020-03-27
    • 2018-06-24
    • 1970-01-01
    • 1970-01-01
    • 2016-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-09
    相关资源
    最近更新 更多