zoukankan      html  css  js  c++  java
  • 使用Restify+superagent做数据转发

    最近为了解决跨域问题,做了一个Node数据转发服务器,使用到了Restify和superagent。

    Restify 是nodejs的模块。虽然restify的API或多或少的参考了express,但restify不是一个MVC框架,它是一套为了能够正确构建REST风格API而诞生的框架。

    而superagent不用多说,熟悉nodejs的同鞋应该都知道,superagent是nodejs里一个非常方便的客户端请求代理模块。

    这个服务器的任务很简单,就是接收客户端发出的请求,并根据请求向第三方服务请求数据,并将返回的数据返回给客户端,同时在服务端设置的请求头,解决了跨域问题。

    下面我以请求知乎日报的数据为例,放上部分代码:

    这部分我对相关的api做了一个封装:

    // api.js
    var request = require('superagent');
    
    var root = 'http://news-at.zhihu.com/api/4';
    
    var _api_base = function (req, res, next, url, success, failure) {
        // 处理跨域问题
        res.setHeader('Access-Control-Allow-Origin', '*');
        request('GET', root + url)
            .accept('json')
            .end(function (err, resp) {
                if (err) {
                    console.log('api error, HTTP CODE: ' + res.status);
                    return;
                };
                if (resp.body) {
                    if (success) {
                        success(resp.body);
                    } else {
                        // 将请求到的数据返回给客户端
                        res.send(resp.body);
                    }
                } else {
                    if (failure) {
                        failure(resp.body);
                    } else {
                        console.log('error: ' + JSON.stringify(resp.body));
                    }
                }
            });
    };
    
    var Api = {
        // @最新消息
        getLatestNews: function (req, res, next, success) {
            _api_base(req, res, next, '/news/latest');
        },
        // @消息内容获取与离线下载
        getNewsContent: function (req, res, next) {
            var id = req.params.id;
            _api_base(req, res, next, '/news/' + id);
        },
        // @过往消息
        getOldNews: function (req, res, next) {
            var date = req.params.date;
            _api_base(req, res, next, '/news/before/' + date);
        },
        // @新闻额外信息
        // 输入新闻的ID,获取对应新闻的额外信息,如评论数量,所获的“赞”的数量
        getNewsExtraInfo: function (req, res, next) {
            var id = req.params.id;
            _api_base(req, res, next, '/story-extra/' + id);
        },
        // @新闻对应长评论查看
        getLongComments: function (req, res, next) {
            var id = req.params.id;
            _api_base(req, res, next, '/story/' + id + '/long-comments');
        },
        // @新闻对应短评论查看
        getShortComments: function (req, res, next) {
            var id = req.params.id;
            _api_base(req, res, next, '/story/' + id + '/short-comments');
        },
        // @主题日报列表查看
        getThemesList: function (req, res, next) {
            _api_base(req, res, next, '/themes');
        },
        // @主题日报内容查看
        getThemesContent: function (req, res, next) {
            var id = req.params.id;
            _api_base(req, res, next, '/theme/' + id)
        },
        // @热门消息
        getHotNews: function (req, res, next) {
            _api_base(req, res, next, '/news/hot');
        }
    };
    
    module.exports = Api;
    

    这部分便是转发服务器的具体实现:

    // app.js
    var restify = require('restify');
    var Api = require('./api');
    
    var server = restify.createServer();
    server.get('/news/latest', Api.getLatestNews);
    server.get('/news/:id', Api.getNewsContent);
    server.get('/news/before/:date', Api.getOldNews);
    server.get('/story-extra/:id', Api.getNewsExtraInfo);
    server.get('/story/:id/long-comments', Api.getLongComments);
    server.get('/story/:id/short-comments', Api.getShortComments);
    server.get('/themes', Api.getThemesList);
    server.get('/theme/:id', Api.getThemesContent);
    server.get('/news/hot', Api.getHotNews);
    
    server.listen(8899, function () {
        console.log('%s listening at %s', server.name, server.url);
    });
    

    完整项目我已经上传到了GitHub:戳这里

  • 相关阅读:
    多线程22:线程池
    多线程21:信号灯法
    多线程20:管程法
    多线程19:生产者消费者模式
    多线程18:Lock锁
    多线程17:死锁
    多线程16:CopyOnWriteArrayList
    多线程15:线程同步
    多线程14:三大不安全案例
    业余草 maven异常:Updating Maven Project 的统一解决方案
  • 原文地址:https://www.cnblogs.com/neromaycry/p/7079427.html
Copyright © 2011-2022 走看看