在JavaScript SDK里使用SoundCloud API

SoundCloud开发出了一款可被开发者使用的API,这款API能使开发者获得他们想要的几乎任何数据。但是该API的用法有些混乱,特别是对初学者来说,因为此时的SoundCloud API开发文档和文档示例使用的都是SDK(软件开发工具箱)的不同版本。

SoundCloud介绍链接地址: http://baike.sogou.com/v128528573.htm

SoundCloud API和SoundCloud
SDK之间有什么区别呢?从根本上说,SoundCloud API是一个URL的集合,它给开发者提供了从SoundCloud服务器获取数据的权限,
而SoundCloud SDK是为查询SoundCloud API提前写好的库(或者客户端)。如果想了解更多关于这方面的内容,点击以下链接:http://stackoverflow.com/questions/834763/difference-between-an-api-and-sdk

在这个教程里,我们将学到如何访问SoundCloud API和如何简化使用SoundCloud
SDK的过程。我们将从SoundCloud上学习如何设置SoundCloud
SDK,然后接着编写JavaScript代码来获取SoundCloud数据,播放音频和更多SoundCloud提供的功能。

入门指南

Promises介绍链接地址: http://www.oschina.net/translate/what-is-the-point-of-promises?print

了解HTTP和API的概念和工作方式对你学习本教程将会有帮助。如果你想了解更多关于API的信息,我推荐你看看:An Introduction to APIs(对API的一个介绍。链接地址:https://zapier.com/learn/apis/)。同时知道一点关于异步JavaScript,promises和回调函数对你学习本教程也是有帮助的。在本文我们的代码示例中使用了jQuery,所以如果你了解jQuery的基本知识,那么你阅读本文的代码示例就不会那么痛苦。

为了使用JavaScript来开始查询SoundClound API,我们需要下载由SoundClound提供的JavaScript SDK。就像在文章开头提到的,这里共有两个不同的SDK版本可以使用。

使用哪个版本的SDK呢?

这两个版本的SDK的主要不同之处在于当一个异步请求产生并将请求发送给SoundClound API时它们返回数据的方式不同。最新版本的SDK返回的是一个Promise,而另一个版本的SDK需要把一个回调函数作为一个参数返回。

我注意到一个问题,随着文档使用的SDK版本,在该版本的SDK用户登录功能界面上似乎有一个问题,这个问题就是弹出的登录窗口不会自动关闭。

因此,为了简单起见,并且因为老版本SDK更稳定,我们将在文章示例中使用老版本的SDK来贯穿本教程。此版本的SDK将需要为客户端的异步请求返回一个回调函数。

使用SoundCloud API

设置一个基本的HTML文档

我们创建一个基本的HTML页面,该页面用作我们的主页。我们在这个页面上<script>标签的属性src里包含进了SDK的地址,这样我们就可以使用SDK的功能了。


  1. <!DOCTYPE html> 
  2. <html> 
  3.   <head> 
  4.     <title>Include SDK - Using SoundCloud API</title> 
  5.     <script src="//connect.soundcloud.com/sdk.js"></script> 
  6.   </head> 
  7.   <body></body> 
  8. </html> 

注意:我们在HTML页面里的<script>标签的src里包含进去的SDK地址是SoundCloud的服务器地址。你也可以把SDK下载下来,然后像下面这样引用:


  1. <script src="sdk.js"></script> 

可以通过下面的方法步骤测试一下SoundCloud的SDK是否在你的网页中被正确加载:

  • 用浏览器打开这个页面(建议使用谷歌的Chrome浏览器)。
  • 在浏览器里打开开发者控制台(在谷歌Chrome浏览器里打开开发者控制台的快捷键是Ctrl+Shift+J)。
  • 在开发者控制台里输入SC,然后按Enter键。SC就是刚刚我们在HTML页面里包含的SDK创建的一个JavaScript对象。

如果出现了未知的错误,那就说明SoundCloud的SDK没有被正确加载。试着刷新一下,同时确定你的SDK文件(也就是sdk.js文件)的路径是正确的。

注册一个SoundCloud App

去注册一个SoundCloud
app,你需要做的就是拥有一个SoundCloud账户。如果你还没有一个SoundClound账户,就去创建一个。通过注册一个
app,SoundCloud服务器就能够验证我们的请求,这样其他人就不可能以我们的名义来发送一个请求了。

注意:如果我们不准备在我们自己的网站中使用SoundClound用户登录功能,我们可以跳过这一步。这将在下面的部分解释。

  • 打开SoundClound app页面。在这个页面上所有我们已经创建好的app都会被列出来。确保你登录了你的SoundCloud账户。注意:你不用为了这个目的创建一个独立的账户。你可以用同一个账户来为你的个人目的使用。
  • 点击注册一个新应用按钮。

  • 给你的app起一个名字,然后点击复选框接受SoundCloud的开发者政策条款

  • 点击那个大大的”注册”按钮,来完成app的注册。

在我们成功注册之后,注册页面将直接跳转到我们刚刚创建好的app设置页面。在app设置页面上,我们将看到我们的app客户端ID,这个ID将会被用来验证授权我们的请求。我们可以关掉该页面,然后现在开始回调字段了。我们之后会用到这个客户端ID的。

初始化客户端

通过”初始化客户端”,那也就是意味着我们使客户端准备好在它和SoundCloud API之间做数据的交换。我们可以在我们之前创建的基本HTML文档里来做初始化客户端的工作,或者在一个内部js文件里来做初始化客户端的工作。

JavaScript语法是这样做的:


  1. SC.initialize({ 
  2.   client_id: "CLIENT_ID", 
  3.   redirect_uri: "CALLBACK_URL" 
  4. });

(代码见原文)

让我们分段来看它:

  • 上面代码中的CLIENT_ID会在我们注册app的时候提供给我们。
  • 上面代码中的CALLBACK_URL是callback.html的URL,这个callback.html是用户登录后一个HTML文件的称呼。我们很快就会创建它。

在初始化完成之后,现在我们可以准备查询SoundCloud API了。让我们看看在那之前我们可以做的一些例子。

示例

如果我们打开浏览器的控制台并输入”SC.”,然后与SC对象有关的方法就会列出来。SC.get(uri,callback)就是其中一个方法,这个方法用来向SoundCloud API产生GET请求。

获得一份跟踪列表

为了获得跟踪的随机列表,我们可以使用SC.get()方法,像下面这样:


  1. SC.get("/tracks", function(response) { 
  2.   for (var i = 0; i < response.length; i++) { 
  3.     $("ul").append("<li>" + response[i].title + "</li>"); 
  4.   } 
  5. });

(代码见原文)

上面的代码是干什么的,它是用来查询/tracks端点并且在查询完端点后返回一个回调函数的。响应数据是保存在回调响应参数里的,它是一个有着很

多属性的JavaScript对象数组,title属性就是众多属性中的一个。我们可以在代码里写:console.log(response[0])来
在控制台日志输出响应数据的第一个,而不用循环遍历所有的对象和对象所对应的属性。然后,我们就会知道哪些属性我们可以使用。

注意:在这个代码示例中,我们在初始化的时候并没有指定一个回调URL。这是因为我们指定不指定都不重要。不管怎样我们的代码都会执行。但是一旦我
们实现了用户登录功能,这就是必须的而且很重要了,因为当你指定一个回调URL后,其他人就不可能使用我们的Client ID。

嵌入一段跟踪代码

SC对象提供了其他的方法:SC.oEmbed(url,options,callback)。该方法把SoundCloud播放器嵌入我们的网站,并且允许我们播放我们选择的轨迹。


  1. SC.oEmbed('https://soundcloud.com/username/complete-url-to-the-track', {maxheight: 200, auto_play: false}, function(res) { 
  2.   $("#player").html(res.html); 
  3. }); 

我们分段来看它:

  • 首先在该方法的第一个参数里,我们给了一个完整的我们想要播放的跟踪URL。
  • 该方法的第二个参数是可选参数,在这个参数里,我们可以为播放器设置一些选项。如果想了解更多,点击下面链接:https://developers.soundcloud.com/docs/api/reference#oembed
  • 第三个参数是一个回调函数,在这个回调函数里,我们将我们页面里的(id为player)的一个元素的内容用该播放器(res.html)的HTML代码替换。

这个跟踪路径可以用来在一个网站里嵌入一首歌或者一首音乐。

实现用户登录

为了实现用户登录功能,我们需要有一个回调URL来达到验证授权的目的。这是OAuth协议的要求。如果你想了解OAuth协议,这里有一个OAuth协议的简单解释:OAuth 2 Simplified(链接地址:https://aaronparecki.com/2012/07/29/2/oauth2-simplified)。因此让我们在app设置里添加一个名为”callback.html”的回调URL,这个callback.html我们接下来就会创建。

OAuth协议介绍链接地址: http://menglimengwai.iteye.com/blog/496250

创建回调页

在一个用户登录后,弹出式窗口会重定向到该文件。在我们的例子中,我们把该文件定义为”callback.html”,并且该文件和我们的主页(index.html)保存在相同的目录里。这个文件就是在我们的app设置里我们需要在回调字段里给定的文件。

我们需要在回调文件里使用的代码在开发文档里有提供。然而,开发文档有点过时,因此我们需要稍微调整一下来满足现在的开发需要标准。

你可以根据你个人的喜好来调整它的通知和设计,但是现在,我们使它越简单越好:


  1. <!DOCTYPE html> 
  2. <html lang="en"> 
  3.   <head> 
  4.     <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 
  5.     <title>Connect with SoundCloud</title> 
  6.   </head> 
  7.   <body> 
  8.     <h4>This popup should automatically close in a few seconds</h4> 
  9.  
  10.     <script> 
  11.       document.onload = function () { 
  12.         window.opener.setTimeout(window.opener.SC.connectCallback, 1); 
  13.       } 
  14.     </script> 
  15.   </body> 
  16. </html> 

用户登录

SC.connect(callback)就是实现用户登录功能的方法。它通过打开一个弹窗式的窗口,提醒用户登录他们的SoundCloud账户。基本的使用方法如下:


  1. SC.connect(function () { 
  2.   console.log("User has logged in"); 
  3. }); 

如下是更有趣的示例:


  1. SC.connect(function () { 
  2.   SC.get("/me", function (response) { 
  3.     console.log("Welcome" + response.username); 
  4.   }); 
  5. }); 

让我们分段来看它:

  • 在用户完成登录以后,用户登录页面将会被重定向到我们之前创建的callback.html页面。
  • 然后随着我们阅读完callback.html里的代码,弹出式窗口会自动关闭。
  • 在那之后,我们的回调函数将获得回调,该回调是在SC.get()方法里通过一个GET请求到”/me”端点获得的。
  • 当GET请求完成时,上述代码的回调函数就会执行,然后在控制台会输出一条欢迎登陆的信息。

注意:请求”/me”返回的是当前登陆用户的数据。因此,在用户登录之前请求该URL将产生一个错误的信息。

处理用户数据

一旦用户登录完成,有很多事情我们可以做。为了演示一些功能,我在GitHub上创建了一个演示站点。你可以点击这里查看源代码: https://github.com/sitepoint-editors/SC_API,并且可以点击这里看看它的执行效果: http://mustagheesbutt.github.io/SC_API/

让我们看看这两个文件。在index.html里,有四个重要的div元素,它们在用户完成登录后将会填满用户的数据:


  1. <main> 
  2.  
  3.     <div id="ui"> 
  4.         <h2>Welcome <span></span></h2> 
  5.         <img id="avatar" /> 
  6.         <div id="description"></div> 
  7.     </div> 
  8.  
  9.     <!-- TRACKS --> 
  10.     <div id="tracklist"> 
  11.         <h3>Your Tracks:</h3> 
  12.         <ul></ul> 
  13.     </div> 
  14.     <!-- PLAYLISTS --> 
  15.     <div id="playlists"> 
  16.         <h3>Your Playlists:</h3> 
  17.         <ul></ul> 
  18.     </div> 
  19.  
  20.     <div id="player"></div> 
  21.  
  22. </main> 

第二个最重要的文件是script.js:所有的奇迹都发生在这个文件里。大部分代码我们都很熟悉,但是我们还是快速地看看:


  1. // Initialization of SDK 
  2. SC.initialize({ 
  3.   client_id: "21832d295e3463208d2ed0371ae08791", 
  4.   redirect_uri: "http://mustagheesbutt.github.io/SC_API/callback.html" 
  5. }); 

首先初始化我们的app。注意,这次我们用redirect_uri指定了我们的callback.html页面。这个URL或者URI必须和我们在app设置里指定的一致。


  1. // Login handler 
  2. var user_perma; 
  3. $("#login").click(function () { 
  4.     SC.connect(function () { 
  5.         SC.get("/me", function (me) { 
  6.             user_perma = me.permalink; 
  7.             setUI(me.username, me.avatar_url, me.description); 
  8.         }); 
  9.         if (SC.isConnected) { 
  10.             $("header, main").addClass("loggedIn"); 
  11.         } 
  12.         getTracks(); 
  13.         getPlaylists(); 
  14.     }); 
  15. }); 

然后我们给标签id为login的button添加一个点击事件句柄。当该按钮被点击时,将会在点击事件代码里执行SC.connect(callback)代码,该代码执行后,将会弹出一个窗口提示用户登录。

当用户登录完成后,弹出的窗口会关闭。然后SC.connect()里的回调函数就会执行。在回调函数里,我们对”/me”端点发起一个GET请
求,而”/me”端点返回当前登录用户对象。在刚才我们发起的GET请求回调里,我们在变量user_perma里存储用户的永久链接,该参数是在全局范
围定义的,所以我们之后可以使用它。

setUI()方法,getTracks()方法和getPlaylists()方法的功能分别是,设置UI,列出用户的跟踪记录和列出每个用户的播放列表。这些功能在同一个文件里已经被定义了。


  1. //找点东西播放 
  2.  
  3. function play(uri) { 
  4.  
  5.     url = "http://soundcloud.com/" + user_perma + "/" + uri; 
  6.  
  7.     SC.oEmbed(url, {maxheight: 200}, function (resp) { 
  8.  
  9.         $("#player").html(resp.html); 
  10.  
  11.     }); 
  12.  

//当一个播放轨迹或者一个播放列表被检查时,使用’play()’函数播放


  1. $("ul").on("click", function (e) { 
  2.  
  3.     var title = e.target.innerHTML; 
  4.  
  5.     if ( tracks.hasOwnProperty(title) ) { 
  6.  
  7.         play(tracks[title]); 
  8.  
  9.     } else if (playlists.hasOwnProperty(title)) { 
  10.  
  11.         play("sets/" + playlists[title]); 
  12.  
  13.     } 
  14.  
  15. }); 

当任何跟踪路径或者播放列表名被点击,play()方法就会执行,该方法会为点击的跟踪路径或者播放列表名通过SC.oEmbed()方法来在我们的页面中嵌入一个音频播放器。

我们能通过代码做很多事情,例如获取用户类型或者更新用户的信息,获取用户的头像,接下来运行代码看看SoundCloud服务器返回的信息里用户是谁和他们的爱好是什么。

总结

  • 如果老版本的SDK的用户登录功能可以使用,请使用老版本的SDK。因为老版本的SDK稳定,并且返回的数据使用回调函数返回。
  • 如果老版本的用户登录功能不可用,可以使用SDK的新版本。新版本的SDK使用promises来返回数据。
  • 通过一个简单的GET请求就能访问SoundCloud API获取到数据。
  • 用户特有的数据可以通过”/me”端点获取,但是只有在用户使用他们的SoundCloud账户登录我们的网站的情况下才有效。

从客户端查询一个API是一个很强大的工具,因为它在复杂的后端保存了我们的信息。SDK使我们的编程生活变得简单很多。在学习了它的基础用法后,我们甚至可以编写出更加强大的和用户更加友好的web应用。点击查看一些示例(链接地址: http://codepen.io/search/pens?q=soundcloud&limit=all&type=type-pens),并且查看官方的SoundCloud文档来学习更多关于这个强大的API的可以使用的方法。

我希望从你那里听到你用SoundCloud SDK构建的应用的信息(或者正计划构建的应用的信息)。请让我看见你们的评论!

作者介绍:

Mustaghees Butt 是一名Web开发人员和作家

Mustaghees是一名自由的Web设计师和开发者,他有时也写些文章和教程。

他的兴趣包括计算机科学(包括机器人技术,AI人工智能和网络技术)和文学艺术。

作者:唐李川

来源:51CTO

时间: 2024-11-10 01:11:11

在JavaScript SDK里使用SoundCloud API的相关文章

拥抱ES6——OSS JavaScript SDK开发手记

JavaScript作为当下最火的语言(之一),结合OSS能够创建出非常丰富的跨前后端的应用.现在,OSS正式推出JavaScript SDK,使用OSS的 前后端 同学 都 可以方便地使用. ES6 首先,什么是ES6? 其实ES6是最新版本的ECMAScript,也就是JavaScript标准. ECMAScript 6, also known as ECMAScript 2015, is the latest version of the ECMAScript standard. > ES

谈谈javascript语法里一些难点问题(一)

1)    引子 前不久我建立的技术群里一位MM问了一个这样的问题,她贴出的代码如下所示: var a = 1; function hehe() {          window.alert(a);          var a = 2;          window.alert(a); } hehe(); 执行结果如下所示: 第一个alert:   第二个alert:   这是一个令人诧异的结果,为什么第一个弹出框显示的是undefined,而不是1呢?这种疑惑的原理我描述如下: 一个页面

谈谈javascript语法里一些难点问题(二)

3)    作用域链相关的问题 作用域链是javascript语言里非常红的概念,很多学习和使用javascript语言的程序员都知道作用域链是理解javascript里很重要的一些概念的关键,这些概念包括this指针,闭包等等,它非常红的另一个重要原因就是作用域链理解起来太难,就算有人真的感觉理解了它,但是碰到很多实际问题时候任然会是丈二和尚摸不到头脑,例如上篇引子里讲到的例子,本篇要讲的主题就是作用域链,再无别的内容,希望看完本文的朋友能有所收获. 讲作用域链首先要从作用域讲起,下面是百度百

开发-请问:环信sdk里有转码的接口吗?

问题描述 请问:环信sdk里有转码的接口吗? 我是一个新手,在开发的过程遇到一个问题,请问:环信sdk里有转码的接口吗? 解决方案 有的,sdk内部使用amr格式.服务器有amr转mp4能力,mp4给webim用

jquery-怎么访问javascript脚本$里的函数?

问题描述 怎么访问javascript脚本$里的函数? $ = window.$ || {}; $pt = window.$pt || {}; $.Encryption = $pt.Encryption = function() { function getEncryption() { ... } } (); 怎么调用函数getEncryption? 只有5个C币,不要嫌少啊 解决方案 你这样是访问不了的吧. $ = window.$ || {}; $pt = window.$pt || {};

azure-我想用javascript去调用Bing Search API, 但是总是报认证错误,什么原因?

问题描述 我想用javascript去调用Bing Search API, 但是总是报认证错误,什么原因? 大家好! 我想用javascript去调用Bing Search API, 但是总是报认证错误,是不能使用Js调用呢还是我的认证方式错了? 求解答?? 解决方案 一般都有oauth认证.你需要先拿到一个授权token 解决方案二: 您好, 可以使用JS去调用,您可以参考我如下的调用方式: <!DOCTYPE html> <html> <head> <scri

vb.net-.NET framework SDK 能否完全替代API函数?

问题描述 .NET framework SDK 能否完全替代API函数? 微软在发行了VB.NET 之后,许多VB6中可以调用的API函数失效了.据说微软已经用.NET类库把大多数API函数封装了起来,故鼓励用户调用这些,好处一是方便,这个不多说:二是兼容性,避免使用Windows才听得懂的语言. 然而MFC的封装尚且有所不能及,我们何以相信这个通俗但是年轻的新式封装,就能面面俱到昵? 解决方案 不一定完全可以替代,框架也是在不断完善的,记得以前没有内存映射相关的封装,但现在也已经加进去了 解决

JavaScript代码里的判断小结_javascript技巧

比较判断 比较判断是比较两个值,返回一个布尔值,表示是否满足比较条件.JavaScript一共提供了8个比较运算符,这里主要说一下严格相等运算符和相等运算符的区别 严格相等运算符=== 判断 返回 两个值类型不同 false 两个值都是null/undefined/true/false true 两个值其中之一为NaN false 两个值都为数值且值相等 true 两个值都为字符串,且值相等 true 两个值都指向同一个引用类型 true 1 === "1" // false true

环信sdk里有转码的接口吗?

问题描述 环信sdk里有转码的接口吗? 解决方案 有的,sdk内部使用amr格式.服务器有amr转mp4能力,mp4给webim用