做爲所有結果的子集,響應必然會提供一個response.paging.next
屬性。這個屬性能夠塞回hello.api
,以取得結果的下一頁。javascript
在下面的示例中,函數paginationExample()
調用了hello.api("me/frields")
。後續的調用從resp.paging.next中取得path。html
javascriptfunction paginationExample(path) { hello('facebook') .api(path, {limit: 1}) .then( function callback(resp) { if (resp.paging && resp.paging.next) { if (confirm('Got friend ' + resp.data[0].name + '. Get another?')) { // Call the API again but with the 'resp.paging.next` path paginationExample(resp.paging.next); } } else { alert('Got friend ' + resp.data[0].name); } }, function() { alert('Whoops!'); } ); } paginationExample('me/friends');
scope屬性定義了應用須要從網絡提供者那邊取得哪些特權。經過hello.init(object,{scope:'string'})
,scope能夠被定義爲會話全局性的,而hello('network').login({scope:'string'});
只在觸發身份驗證時可用。java
每一個應用能夠指定多個scope,能夠用逗號隔開,以下所示:node
javascripthello('facebook').login({scope: 'friends,photos,publish'});
scope與API請求是緊密耦合的,當會話缺失,或者不可用時,它將斷開。git
下表描述了HelloJS曝露的默認scope。能夠添加額外的scope以增長專有服務。可是必須當心不要混用專用scope和你不知道如何使用的其餘服務。github
scope | description |
---|---|
default | 讀取基本我的信息 |
"friends" | 讀取朋友的我的信息 |
"photos" | 讀取用戶相冊以及圖片 |
"files" | 讀取用戶文件 |
"publish" | 發佈狀態更新 |
"publish_files" | 發佈圖片和文件 |
把使用限制在一個scope裏是個良好的做法,並且還讓用戶意識到爲何你的應用程序須要某些特權。當用戶須要用你的應用的更多功能時,再嘗試更新受權。舉個例子,若是用戶想把一個連接分享給朋友,包括一個用戶必須點擊的按鈕,以觸發scope爲"feiends"的hello.login,而後在驗證身份以後處理器觸發API調用。數據庫
hello.api([path]).then(null,[errorHandler])
可以返回錯誤信息。或者使用hello.api([path],[handlesuccessOrError])
。windows
Promise響應標準化了error處理器的綁定。api
一個失敗請求的errorHandler對象的第一個參數,多是boolean(false)
,也多是一個Error Object。promise
Error Object對象的結構:{code:string,message:string}。
添加到HelloJS的服務是模塊化的。欲知更多關於建立你本身的模塊的信息和示例,請看Modules。
|方法|網站
|OAUTH2:隱式受權服務,不須要服務器端受權|windows、google、facebook、Instagram、soundcloud、foursquare|
|OAUTH2:顯式受權服務,服務必需oauth_proxy|windows、google、facebook、Instagram、linkedin、soundcloud、foursquare、github|
3.OAUTH1 & 1A:服務必需oauth_proxy|dropbox、twitter、yahoo、fickr|
對於只支持OAuth1或者OAuth2顯式受權的服務提供者,身份驗證流必須用一個密鑰才能登入,這個密鑰可能不會曝露在瀏覽器中。HelloJS用oauth_proxy
定義了一箇中間媒介,經過這個Web服務,HelloJS規避了這個問題。必須向這項服務提供一個anaccess_token,這項服務從數據庫查找密鑰並執行握手。若是是用OAuth1,網站服務器還登入了後續的API請求。
快速起步:在OAuth代理服務器上註冊你的ClientID以及密鑰。
這個默認的代理服務是https://auth-server.herokuapp.com/。開發員能夠把他們本身ClientID以及密鑰添加到服務器上,從而啓動並運行。
另外一種辦法是用node-oauth-shim
從新建立這個服務,而後在HelloJS客戶端腳本hello.init中中覆蓋默認的oauth_proxy
,以下所示:
javascripthello.init( CLIENT_IDS, { oauth_proxy: 'https://auth-server.herokuapp.com/proxy' } )
異步方法hello.login
、hello.logout
以及hello.api
的響應返回了一個可延遲的方法,就是Promise A+兼容。
若是你把庫綁定在「src/*」文件裏,請看這個promises-demo以瞭解更多。
HelloJS瞄準全部的現代瀏覽器。
填充物包含在「scr/hello.polyfill.js」中,它提供了舊瀏覽器兼容功能。若是你使用了放在「dist/」目錄下所源碼,它已經綁定好了。可是若是你是從源碼開始構建的,你可能喜歡先定義是否必需要用於填充物,或者你已經支持了它們。
HelloJS同時還能夠支持在PhoneGap應用上。請看這個hellojs-phonegap-demo以瞭解更多。
函數hello.api
、hello.login
以及hello.logout
返回一個Promise/A+ 1.1.1兼容的then方法。
這個示例演示瞭如何在調用hello.login
和hello.api
時使用Promise對象以操做響應。
javascriptfunction login(network){ // Make a login call and handle the response using promises hello.login(network).then(function(){ console.log('fullfilled', 'making api call'); // Reurn another promise to get the users profile. return hello( network ).api( 'me' ); }).then(function(p){ // Print it to console. console.log('hello.api(me) was fullfilled', p); return p; }).then(function(p){ // Insert it into thumbnail document.getElementById(network).innerHTML = "<img src='"+ p.thumbnail + "' width=24/>Connected to "+ network+" as " + p.name; }).then(null, function(e){ // Uh oh console.error(e); }); }
得到google好友以及聯繫人
javascriptfunction friendsAndContacts(network){ // Make a login call and handle the response using promises hello(network).login({scope:'friends'}).then(function(){ console.log('fullfilled', 'making api call'); // Reurn another promise to get the users profile. return Promise.all([ hello( network ).api( 'me/friends' ), hello( network ).api( 'me/contacts' ) ]); }).then(function(all){ // Build a list of friends var a = []; for(var i=0;i<all.length;i++){ for(var j=0;j<all[i].data.length;j++){ a.push(all[i].data[j].name); } } document.getElementById('friends').innerHTML = a.join(','); }, function(e){ // Uh oh console.error(e); }); }
初始化應用
javascripthello.init( { google : CLIENT_IDS.google }, { redirect_uri : '../redirect.html' });