使用 jquery jsonp 访问 Coursera api 的数据表单

Posted

技术标签:

【中文标题】使用 jquery jsonp 访问 Coursera api 的数据表单【英文标题】:Access the data form Coursera api using jquery jsonp 【发布时间】:2015-02-06 01:13:40 【问题描述】:

今天我在阅读 Coursera catalog 文档后尝试使用 jquery 访问 coursera api。写了个代码,报错No 'Access-Control-Allow-Origin' header is present on the requested resource.于是google了一下,发现可以使用Jsonp进行跨域请求。所以我只是使用 $.ajax 函数向这个url 发出请求,或者说这个simple url 和其他一些这样的url,但失败了。

网址上的数据类似于"elements":["id":2,"shortName":"ml","name":"Machine Learning","links":],"linked":

我写了以下代码。

$(document).ready(function() 
$.ajax(
    url: "https://api.coursera.org/api/catalog.v1/courses/2",
    type: "GET",
    dataType: 'jsonp',
    jsonpCallback: 'localJsonpCallback',
    contentType: 'application/json',
    success: function()
        alert("success");
    ,
    error:function(jqxhr, textStatus, error)
        alert("textStatus : " + textStatus + "\n error" + error);
       
  ); 

  function localJsonpCallback(data) 
  alert("localJsonpCallback : " + data);
  
  );

上述代码失败并进入错误处理程序,其打印错误为textstatus: parseErrorError: localJsonpCallback was not called。我没有得到代码有什么问题。此外,在控制台中,使用 url https://api.coursera.org/api/catalog.v1/courses/2 时出现错误 Uncaught SyntaxError: Unexpected token :2?callback=localJsonpCallback&_=1418037208234:1

需要使用jsonp回调函数吗?我们不能在成功处理程序中处理直接响应吗?

【问题讨论】:

我已将这些文件放在我的桌面上。我基本上是在尝试创建一个 chrome 扩展,所以我必须将这些文件放在一些非服务器目录中。 我认为 Coursera API 不支持 JSONP :( 【参考方案1】:

这行得通

可以直接在success回调中处理

$(document).ready(function() 
  $.ajax(
    url: "https://api.coursera.org/api/catalog.v1/courses/2",
    type: 'GET',
    dataType: "json",
    success: function(data) 
        console.log(JSON.stringify(data,null,4));
    
  ); 
);

返回

 
    "elements": [
        
            "id": 2,
            "shortName": "ml",
            "name": "Machine Learning",
            "links": 
        
    ],
    "linked": 

希望对你有帮助

【讨论】:

它在服务器端工作。谢谢 。必须将此代码放在位于var/www/ 下的文件中。【参考方案2】:

试试这个:-

$(document).ready(function()     
$.getJSON("https://api.coursera.org/api/catalog.v1/courses?ids=2,3&fields=language,shortDescription&includes=sessions&fields=status&categories", function (response) 
alert(JSON.stringify(response));
,'jsonp'); 
 );

Demo

【讨论】:

它在服务器端工作。谢谢 。必须将此代码放在位于var/www 下的文件中。【参考方案3】:

在我们的例子中你不需要使用jsonp,你可以使用通常的ajax请求

$.ajax(
    url: "https://api.coursera.org/api/catalog.v1/courses/2",
    type: "GET",
    dataType: 'json',
    success: function (res) 
      console.log(res);
    ,
    error: function(jqxhr, textStatus, error) 
        alert("textStatus : " + textStatus + "\n error" + error);
    
);

演示:http://jsbin.com/payare/1/edit?js,console

【讨论】:

以上是关于使用 jquery jsonp 访问 Coursera api 的数据表单的主要内容,如果未能解决你的问题,请参考以下文章

JQuery+ajax+jsonp 跨域访问

JQuery+ajax+jsonp 跨域访问

JQuery+ajax+jsonp 跨域访问

使用 jQuery.ajax 和 JSONP 设置标题?

使用 jsonp 错误的 jQuery ajax 请求

使用 jQuery 1.5 将请求作为 jsonp 发送,将响应解释为文本