内容简介:最近 node.js 一个比较出名的 http其实现在node.js的http模块已经非常完善,几行代码就能自己写一个,比如:
最近 node.js 一个比较出名的 http request 模块停止维护了。其实这个模块已经变得非常臃肿,模块依赖过多,体积过大,接口不统一。
其实现在node.js的http模块已经非常完善,几行代码就能自己写一个,比如:
Node.js网页抓取:一个最简单的http请求客户端示例(request client)
不过上面的示例并不支持post和文件下载,只要稍加改动即可。
源代码
var http = require('http') var https = require('https') var url = require('url') var qs = require('querystring') var filters = [] /* settings => { url: '/sync/list' , data: { a,b,c } / stream , type: 'qs' / 'json' , dataType: 'json' / 'qs' / 'raw' / 'stream' } cb => (err, res, {}) */ var request = function(settings, cb) { if (typeof settings == 'string') { settings = { url: settings } } settings.headers = settings.headers || {} var data = settings.data || settings.body || settings.json var dataType = settings.dataType var stream var rawData if (data && data.pipe) { stream = data // rawData = data } else if (typeof data == 'object') { if (settings.type == 'qs') { rawData = qs.stringify(data) } else { rawData = JSON.stringify(data) settings.headers['content-type'] = 'application/json' } } else if (data) { rawData = data } if (rawData) { rawData = Buffer.from(rawData) settings.headers['content-length'] = rawData.length } var reqUrl = settings.url var urlObj = url.parse(reqUrl) var options = { hostname : urlObj.hostname , port : urlObj.port , path : urlObj.path , method : settings.method || ((stream || rawData) ? 'POST' : 'GET') , headers : settings.headers } for (var i = 0; i < filters.length; i++) { var filter = filters[i] filter(settings, options) } var requestHandler = function(res) { var receives = [] var err = null var statusCode = res.statusCode var headers = res.headers //重定向 if ((statusCode == 302 || statusCode == 301) && headers.location) { options.url = headers.location request(options, cb) return } if (statusCode > 300) { err = new Error('Request Failed. Status Code: ' + res.statusCode + ' ' + reqUrl) } //doesn't parse data if (dataType == 'stream' || settings.stream) { cb && cb(err, res, {}) return } res.on('data', function(chunk) { receives.push(chunk) }) res.on('end', function() { var resData = Buffer.concat(receives).toString() if (dataType != 'raw') { try { resData = dataType == 'qs' ? qs.parse(resData) : JSON.parse(resData) } catch (e) { } } cb && cb(err, res, resData) }) } var req = urlObj.protocol == 'https:' ? https.request(options, requestHandler) : http.request(options, requestHandler) req.on('error', function(e) { cb && cb(e, null, {}) }) if (stream) { stream.pipe(req) } else { rawData && req.write(rawData) req.end() } } var addFilter = function(filter) { if (typeof filter == 'function') { filters.push(filter) } else { console.log('request middware is not a function') } } module.exports = { request : request , use : addFilter }
参数
请求的网址: url: '/sync/list' 请求POST的数据,如果没有则为GET: data: { a,b,c } / stream 请求的数据类型: type: 'qs' / 'json' 返回的数据类型: dataType: 'json' / 'qs' / 'raw' / 'stream'
使用方法
模拟GET
const request = require('./request').request request({ url: 'http://ourjs.com/home' }, function(err, response, data) { console.log(data) })
模拟POST
指定 data 即可:
request({ url: 'http://ourjs.com/home', data: { abc: 1 } }, function(err, response, data) { console.log(data) })
下载流文件
将请求文件下载到本地,使用流可避免使用进程的缓冲区,可下载大文件
const fs = require('fs') request({ url: 'http://ourjs.com/home', dataType: 'stream' }, function(err, response, data) { let ws = fs.createWriteStream('./ourjs.text') response.pipe(ws) })
文件上传到http request流
为简化操作,提高性能,这里并没有使用HTTP from的文件模式,而是直接将文件流输出到http流,需要在http那端直接将流写入文件。一次仅支持上传一个文件。同样支持大文件上传。
var rs = fs.createReadStream('./ourjs.text') request({ url: 'http://receive.url', data: rs }, function(err, response, data) { console.log(data) })
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- Nginx + Lua搭建文件上传下载服务
- HDFS 的文件上传下载的核心原理
- HDFS 的文件上传下载的核心原理
- Nginx + Lua搭建文件上传下载服务
- JSP servlet实现文件上传下载和删除
- SSH连接远程服务器,并实现文件上传下载
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
世界因你不同:李开复自传(纪念版)
李开复,范海涛 著作 / 中信出版社 / 2015-7-10 / 39.00
编辑推荐 1.李开复唯一一部描写全面生平事迹的传记:《世界因你不同:李开复自传》书中讲述了家庭教育培育的“天才少年”;学校教育塑造的“创新青年”,走入世界顶级大公司,苹果、微软、谷歌等亲历的风云内幕,岁月30载不懈奋斗、追求事业成功的辉煌历程。 2.娓娓道来、字字珠玑、可读性和故事性皆佳。李开复博士是青少年成长成才的励志偶像,年轻家长、学校教师阅读后也能从中得到感悟和启发。 3.......一起来看看 《世界因你不同:李开复自传(纪念版)》 这本书的介绍吧!