使用Javascript执行返回JSON的简单GET请求时出现问题

使用Javascript执行返回JSON的简单GET请求时出现问题,javascript,jquery,ajax,json,Javascript,Jquery,Ajax,Json,我对Javascript很糟糕,所以我先为我将要讨论的问题感到抱歉,我认为这是一个极其愚蠢的问题 我只是尝试为给定用户对GitHub的公共repo API执行一个GET请求,并以JSON的形式返回值 下面是我尝试使用的函数: function get_github_public_repos(username) { var the_url = "http://github.com/api/v2/json/repos/show/" + username $.ajax({

我对Javascript很糟糕,所以我先为我将要讨论的问题感到抱歉,我认为这是一个极其愚蠢的问题

我只是尝试为给定用户对GitHub的公共repo API执行一个GET请求,并以JSON的形式返回值

下面是我尝试使用的函数:

function get_github_public_repos(username) {

    var the_url = "http://github.com/api/v2/json/repos/show/" + username

    $.ajax({
      url: the_url,
      dataType: 'json',
      type: 'get',
      success: function(data) {
        alert('raw data: ' + data)
        var json_response = $.parseJSON(data);
        alert(json_response);
      }
    });
}

这将为数据返回Null。在控制台中,我看到
加载资源失败:已取消
。我知道URL是正确的,因为如果我在URL上运行
curl
,它会返回预期的数据。

JavaScript在不同的服务器上发出请求时会受到跨域限制。

好吧,除非您在github.com域中运行代码,否则这是行不通的

您只能在您的域中使用simle ajax


一种解决方案是为它创建一个代理。在服务器上创建一个页面,该页面只做一件事,使用curl获取请求的(域外)内容,然后打印它。然后使用ajax调用此代理。

由于相同的源策略,XmlHttpRequest对象($ajax使用)无法从不同的域下载内容。您需要使用诸如JSONP之类的工具才能从浏览器执行此操作。

正如其他人所说,您无法在远程域上执行ajax

您需要在您的域(如php)上编写一个服务器端脚本,以完成从github域检索所需信息的繁重工作


然后,使用ajax查询服务器端脚本以获取信息

jQuery的ajax函数支持JSONP,它允许跨域请求(您需要跨域请求,因为您试图从另一个域从github.com请求数据)。只需将数据类型从“json”更改为“jsonp”

function get_github_public_repos(username) {

    var the_url = "http://github.com/api/v2/json/repos/show/" + username

    $.ajax({
      url: the_url,
      dataType: 'jsonp',
      type: 'get',
      success: function(data) {
        var json_response = data;
        alert(data);
      }
    });
}
更新:需要注意的是end pint(在本例中是github.com的API)必须支持JSONP才能工作。正如评论中指出的那样,它不是任何跨域请求的担保解决方案

我知道URL是正确的,因为如果 我在url上运行curl,它返回 预期数据


利用这个想法让ajax工作起来。在站点上创建一个使用curl检索所需数据的代理页面,然后让“the_url”变量指向站点上的该页面。跨域限制使您无法以您尝试的方式使用ajax。

两个问题:(a)如前所述,您无法从其他域获取JSON(如果支持,您必须使用JSONP)(b)如果它正常工作,
数据
将已经被解析,因此
$.parseJSON(数据)
将失败。我已经有一段时间没有使用它了,但我认为端点(github.com)必须支持JSONP才能工作?无论如何,上面的代码是在jsFiddle.Slick中测试的!我不知道jQuery支持这一点@WesleyJohnson,你知道什么版本吗?我相信这实际上可以与GitHub API一起使用,但是你编写它的方式似乎假设它可以与任何API一起使用-服务必须实际提供JSONP服务,并通过
回调
参数指定Javascript回调,这样才能做到这一点。碰巧GitHub提供了一个支持此功能的丰富API。我不知道它是否支持此功能,但我认为它会支持,因为它是一个非常健壮的库。我刚在谷歌上找到jQuery和JSONP,瞧!(哈哈:P)我正在努力寻找它支持的版本,但我还没有任何运气。我想它是从1.5之前就存在了。@nrabinowitz-你是对的,我认为这是我对这个答案的第一次评论所表明的情况。我也会编辑答案,这样任何遇到它的人都会更清楚地看到这个警告。