内容简介:最近 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连接远程服务器,并实现文件上传下载
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
随机密码生成器
多种字符组合密码
XML、JSON 在线转换
在线XML、JSON转换工具