当前位置:网站首页 / Node.js / 正文

[AY-Node.js]写给自己的NodeJs-通讯系统-http调用第三方api【七】[20]

时间:2015年10月30日 | 作者 : aaronyang | 分类 : Node.js | 浏览: 2487次 | 评论 0

HTTP客户端

请求别人api,然后使用

var req=http.request(options,callback)

当客户端请求获取到服务器响应流时,触发response事件。

2015年10月30日      =========== AYUI www.ayjs.net AY 杨洋原创编写,请不要转载谢谢===============

这里我玩 http://apistore.baidu.com/这里的天气api

新建httprequest.js文件

我在合肥,先查询合肥的id =101220101

blob.png

然后我们创建核心options,我自己对照nodejs的api写出来的

var http=require('http');
var options={
    hostname:'apis.baidu.com',
    port:80,
    path:'/apistore/weatherservice/cityid?cityid=101220101',
    method:'GET',
    headers:{'apikey':'738566e4a008d14b31cce6e420cd7b52'}
}

上面应该很容易看懂,当然还有其他几个

然后我们使用request方法

var req=http.request(options, function (res) {
    console.log('状态码:' + res.statusCode);
    console.log('响应头:' + JSON.stringify(res.headers));
    res.setEncoding('utf8');
    res.on('data', function (data) {
       var o= JSON.parse(data);
        console.log('api返回状态:'+o.errMsg);
        var d=o.retData;
        if(d!=undefined){
            console.log(d.city+'('+ d.pinyin+'):'+ d.weather+':'+ d.l_tmp.toString()+'-'+ d.h_tmp.toString()+ d.WD);
        }

    })
});
req.on('error', function (err) {
    if(err.code==='ECONNRESET'){
        console.log('超时错误');
    }else{
        console.log('发生错误' + err.code);
    }

})

req.setTimeout(2000, function () {
    req.abort();
})
req.end();

这里我设置req的超时方法,比如req请求超时了,发生错误了,使用end方法结束请求。

2015年10月30日      =========== AYUI www.ayjs.net AY 杨洋原创编写,请不要转载谢谢===============

效果图:

7.gif

当然可以使用get方法,这样就默认是get了,options中就不用写method了,而且还不用end了

var http=require('http');
var options={
    hostname:'apis.baidu.com',
    port:80,
    path:'/apistore/weatherservice/cityid?cityid=101220101',
    headers:{'apikey':'738566e4a008d14b31cce6e420cd7b52'}
}
var req=http.get(options, function (res) {
    console.log('状态码:' + res.statusCode);
    console.log('响应头:' + JSON.stringify(res.headers));
    res.setEncoding('utf8');
    res.on('data', function (data) {
        var o= JSON.parse(data);
        console.log('api返回状态:'+o.errMsg);
        var d=o.retData;
        if(d!=undefined){
            console.log(d.city+'('+ d.pinyin+'):'+ d.weather+':'+ d.l_tmp.toString()+'-'+ d.h_tmp.toString()+ d.WD);
        }

    })
});

req.on('error', function (err) {
    if(err.code==='ECONNRESET'){
        console.log('超时错误');
    }else{
        console.log('发生错误' + err.code);
    }
})

req.setTimeout(2000, function () {
    req.abort();
})

请求本地服务

新建服务端 httpser.js

/**
 * Created by aaronyang on 2015/10/30.
 */
var http=require('http');
var server=http.createServer((function (req,res) {
        if(req.url!=='favicon.ico'){
            req.on('data', function (data) {
                console.log('服务端接收到的数据' + data);
                res.end();
            })
        }
})).listen(1337,'127.0.0.1');

新建客户端httpcli.js

/**
 * Created by aaronyang on 2015/10/30.
 */

var http=require('http');
var options={
    hostname:'localhost',
    port:1337,
    path:'/',
    method:'POST'
}
var req=http.request(options);
req.write('hello ');
req.end('ay');

效果:服务端收到客户端write的数据

blob.png

服务到收到post后,给客户端数据

服务端修改如下,客户端结束后,服务端响应结束

/**
 * Created by aaronyang on 2015/10/30.
 */
var http=require('http');
var server=http.createServer((function (req,res) {
        if(req.url!=='favicon.ico'){
            req.on('data', function (data) {
                console.log('服务端接收到的数据' + data);

                res.write(data+' 插入成功!');

            })
        }
    req.on('end', function () {
        res.end();
    })
})).listen(1337,'127.0.0.1');

客户端,除了post数据,然后接受服务器的反馈,例如新增数据,然后服务端收到,处理数据,然后返回客户端告诉客户端处理完成,客户端刷新界面,关闭新增窗口

/**
 * Created by aaronyang on 2015/10/30.
 */

var http=require('http');
var options={
    hostname:'localhost',
    port:1337,
    path:'/',
    method:'POST'
}
var req=http.request(options, function (res) {
    res.on('data', function (data) {
        console.log('关闭新增窗口,刷新列表,执行完毕');
    })
});
req.write('hello ');
req.end('ay');

效果如下:

78.gif

服务端响应增加addTrailers,然后客户端拿到头信息

var http=require('http');
var server=http.createServer((function (req,res) {
        if(req.url!=='favicon.ico'){
            req.on('data', function (data) {
                console.log('服务端接收到的数据' + data);
                res.addTrailers({'Content-ay':'ay还是1991年的小男孩'});
                res.write(data+' 插入成功!');

            })
        }
    req.on('end', function () {
        res.end();
    })
})).listen(1337,'127.0.0.1');

客户端

var req=http.request(options, function (res) {
    res.on('data', function (data) {
        console.log('关闭新增窗口,刷新列表,执行完毕');

    })
    res.on('end', function () {
        console.log('头信息:%j',res.trailers);
    })
});

指定键

res.on('end', function () {
    console.log('头信息:%j',res.trailers['content-ay']);
})

blob.png

代理服务器

新建httpProv.js

/**
 * Created by aaronyang on 2015/10/30.
 */
var http=require('http');
var url=require('url');
var server=http.createServer(function (req,res) {
    var urlp=url.parse(req.url);
    var options={
        host:'www.cnblogs.com',
        port:80,
        path:urlp.pathname,
        headers:req.headers
    }
    console.log(options);

    var creq=http.get(options, function (response) {
        res.writeHead(response.statusCode,response.headers);
        response.pipe(res);//将服务器请求的流中转给res
    })
    req.pipe(creq);

}).listen(1337,'127.0.0.1');

这里很多网站做了头文件中的host判断,所以有些无法跳转。

原理,服务器能连外网,你请求他,他请求该网址,然后把response的数据pipe到你的res流中,req也是同样。


2015年10月30日      =========== AYUI       www.ayjs.net      AY         杨洋原创编写,请不要转载谢谢===============

推荐您阅读更多有关于“nodejs,”的文章

猜你喜欢

额 本文暂时没人评论 来添加一个吧

发表评论

必填

选填

选填

必填

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

  查看权限

抖音号:wpfui,可以看到我的很多作品效果

AYUI8社区版Github地址:前往获取

作者:杨洋(AaronYang简称AY,安徽六安人)目前是个人,还没公司AY唯一QQ:875556003和AY交流

高中学历,2015年1月17日开始,兴趣学习研究WPF,目前工作繁忙,不接任何活

声明:AYUI7个人与商用免费,源码可购买。部分DEMO不免费.AY主要靠卖技术服务挣钱

不是从我处购买的ayui7源码,我不提供任何技术服务,如果你举报从哪里买的,我可以帮你转正为我的客户,并送demo

查看捐赠

AYUI7.X MVC教程 更新如下:

第一课 第二课 程序加密教程

兼容XP到win10,vs2015/2017/2019,最新AYUI:7.6.5.5

vs2015 企业版密钥HM6NR-QXX7C-DFW2Y-8B82K-WTYJV

vs2017 企业版密钥NJVYC-BMHX2-G77MM-4XJMR-6Q8QF

标签列表