AngularJS+Satellizer+Node.js+MongoDB->Instagram-15

Build an Instagram clone with AngularJS, Satellizer, Node.js and MongoDB

15.Instagram API 端点

本节中我们实现三个新的路由:

  • 获取认证用户的更新。
  • 获取指定 id 的 Instagram 媒体。
  • 认证用户给特定媒体点赞。

在开始写代码之前,需要找出对应的端点。访问 Instagram API endpoints 来查看 API 端点列表。除了能知道你应该使用什么参数来访问特定端点外,你还可以知道端点会给你返回的对象结构,我觉得这对每个 API 供应商默认都应该有。我觉得有一个样板 API 响应对于前端开发非常有用。比如说,我如果没有拿到 Instagram 的认证令牌的话,我就不知道图像对象的结构到底是什么。

<!-- lang: js -->
<img ng-src="{{photo.images.standard_resolution.url}}" class="thumbnail img-responsive">

https://hackhands.com/wp-content/uploads/2014/11/Screenshot-2014-11-09-23.31.06.png

<!-- lang: js -->
app.get('/api/feed', isAuthenticated, function(req, res) {
  var feedUrl = 'https://api.instagram.com/v1/users/self/feed';
  var params = { access_token: req.user.accessToken };

  request.get({ url: feedUrl, qs: params, json: true }, function(error, response, body) {
    if (!error && response.statusCode == 200) {
      res.send(body.data);
    }
  });
});

注意上面代码的 isAuthenticated 中间件。它防止了那些非认证路由访问。如果你没有注册,然后妄图访问 http://localhost:3000/api/feed 的话,你会拿到下面这样的异常信息:

https://hackhands.com/wp-content/uploads/2014/11/Screenshot-2014-11-09-23.43.51.png

我们的第二个路由会用给定的媒体 id 去获取媒体对象:

<!-- lang: js -->
app.get('/api/media/:id', isAuthenticated, function(req, res, next) {
  var mediaUrl = 'https://api.instagram.com/v1/media/' + req.params.id;
  var params = { access_token: req.user.accessToken };

  request.get({ url: mediaUrl, qs: params, json: true }, function(error, response, body) {
    if (!error &amp;amp;&amp;amp; response.statusCode == 200) {
      res.send(body.data);
    }
  });
});

你可能已经意识到了,这个项目里明显的就是零验证和异常处理。这是故意的,因为我们的主要目的是做一个用户授权的练习。如果你希望把这个代码放到生产中去的话,你应该加上 404 响应,然后在 Angular 中处理并显示 404 页面或者做什么相似的处理的。

我的最后一个 API 路由是允许授权用户点赞:

<!-- lang: js -->
app.post('/api/like', isAuthenticated, function(req, res, next) {
  var mediaId = req.body.mediaId;
  var accessToken = { access_token: req.user.accessToken };
  var likeUrl = 'https://api.instagram.com/v1/media/' + mediaId + '/likes';

  request.post({ url: likeUrl, form: accessToken, json: true }, function(error, response, body) {
    if (response.statusCode !== 200) {
      return res.status(response.statusCode).send({
        code: response.statusCode,
        message: body.meta.error_message
      });
    }
    res.status(200).end();
  });
});

Instagram 只允许每个令牌对它们的 API 每小时做 5,000 次请求。如果你超过这个限制,你会拿到个超速限制异常。我们用 SweetAlert.js 在客户端做异常信息显示。当用户在拿到超速限制之后尝试继续访问 API 的时候显示异常信息。

你可能感兴趣的:(AngularJS,express,nodejs,node,node.js,OAuth,oauth2,Satellizer,OAuthn)