0

Jawbone API 返回每个结果集 10 个 json 对象的分页结果。如何获得其余的分页结果?

该方法的 API文档表明结果集的对象中sleeps存在一个page_token参数。next我下面的输出缺少这个。此外,FAQ表明这page_token需要一个 INT(可能是纪元)时间戳。

  • 第二个:“page_token”参数:如果请求包含“page_token”参数,API 将返回在该 page_token 之前完成的所有锻炼,以相反的顺序(以“limit”或默认值 10 为上限)。page_token 是一个时间戳,并且有一个特殊情况,当请求带有 page_token=0 时,这被解释为传递 page_token = CURRENT_TIMESTAMP,即给予所有锻炼(有限制)

我能够使用 API 进行身份验证并返回一组 10 个结果(第一个分页页面)......但没有page_token

...snip json...
"links": {
      "next": "/nudge/api/v.1.0/users/jMdCUPXZ-InYXo1kcdOkvA/sleeps?start_time=1424699101&updated_after=0&limit=10&end_time=1438723789"
    },
    "size": 10

我误解了文档吗?可能是文档已过时(错误)吗?或者更有可能,我完全误解了这一点,并为我的 node.js 编写了可怕的 JS ......

有人可以直截了当地告诉我如何检索所有结果,而不仅仅是第一页吗?

var express     = require('express');
var app         = express();
var port        = process.env.PORT || 5000;
var passport    = require('passport');
var config      = require('./config.json');
var ejs         = require('ejs');
var https       = require('https');
var fs          = require('fs');
var bodyParser  = require('body-parser');
var jbStrategy  = require('passport-oauth').OAuth2Strategy;
var jsonfile    = require('jsonfile');
var util        = require('util');
var path        = require('path');
/* Calculate date range */
var $today      = new Date()
var $start      = new Date($today); $start.setDate($today.getDate() - 180);
var $end        = new Date($today);
var $startDate  = Math.floor(($start).getTime()/1000);
var $endDate    = Math.floor(($end).getTime()/1000);

app.use(express.logger('dev')); // log every request to the console
app.use(bodyParser.json()); // read cookies (needed for auth)
app.use(express.static(__dirname + '/public'));
app.set('view engine', 'ejs'); 
app.set('views', __dirname + '/views');
app.use(passport.initialize());

/* Default Authentication Path */
app.get('/',
    passport.authorize('jawbone', {
        scope : config.jawboneAuth.scope,
        failureRedirect: '/'
    })
);

/* oauth callback from jawbone */
app.get('/done', passport.authorize('jawbone', {
        scope : config.jawboneAuth.scope,
        failureRedirect: '/'
    }), function(req, res) {
        var result = JSON.parse(body); console.log(result);
        res.redirect('/sleeps');
    }
);

app.get('/sleeps', function(req, res) {

var options = {
    access_token    : config.jawboneAuth.accessToken,
    refresh_token   : config.jawboneAuth.refreshToken,
    client_id       : config.jawboneAuth.clientID,
    client_secret   : config.jawboneAuth.clientSecret
};

if (!config.jawboneAuth.accessToken) {
       // if there's no accessToken, go get one
       res.redirect('/');
    } else {

            var up = require('jawbone-up')(options);
            var page_token = [];

        do {

            up.sleeps.get({
                page_token :   page_token,
                start_time :   $startDate,
                end_time   :   $endDate
            }, function(err, body) {

                if (err) {
                    console.log('Error receiving Jawbone UP data');

                       res.send(err);
                } else {
                    try {
                        var result = JSON.parse(body);

                        var next_page_path = result.data.links.next;
                        //var next_page_token = next_page_path.split(path.sep);
                        //var page_token  = next_page_token[5];
                        //page_token = result.data.links.next
                        console.log(result.data);

                        res.json(result);

                    } // end try
                    catch(err) {
                        console.log(err);
                        res.render('userdata', {
                            requestTime: 0,
                            jawboneData: 'Unknown result'
                            });
                    } // end catch(err)
                    } // end else
                }  //end callback fun
            ); // end up.sleeps.get()

    } // end do
    while(page_token[0] > 1);

}   // end if
}); // end sleeps route

// Setup the passport jawbone authorization strategy
passport.use('jawbone', new jbStrategy({
    clientID        : config.jawboneAuth.clientID,
    clientSecret    : config.jawboneAuth.clientSecret,
    authorizationURL: config.jawboneAuth.authorizationURL,
    tokenURL        : config.jawboneAuth.tokenURL,
    callbackURL     : config.jawboneAuth.callbackURL,
    scope           : config.jawboneAuth.scope,
    passReqToCallback : true 
}, function(req, accessToken, refreshToken, profile, done) {
    // establish a pseudo user session.
    var user = {};
    // If there's no preexisting accessToken, 
    // write one to the config file.
    if (!config.jawboneAuth.accessToken){
        config.jawboneAuth.accessToken = accessToken;
        config.jawboneAuth.refreshToken = refreshToken;
        jsonfile.writeFile('./config.json', config, {spaces: 2},  function(err) {
        console.error(err);
        })
    }
    done(null, user);
}));

// HTTPS
var sslOptions = {
        key     : fs.readFileSync('./.server.key'),
        cert    : fs.readFileSync('./.server.crt')
    };

var secureServer = https.createServer(sslOptions, app).listen(port, function(){
    console.log('Listening on ' + port);
});
4

1 回答 1

0

原来有一个未记录的limit参数已经取代了page_token.

Jawbone 开发人员文档目前已过时。他们的常见问题解答(API 部分问题#12)也是如此。

像这样的 GET 请求似乎可以解决问题

https://jawbone.com/nudge/api/v.1.1/users/@me/sleeps?start_time=1388603458&end_time=1420139458&limit=1000

于 2015-08-06T19:45:51.100 回答