入门到放弃node系列之网络模块(二)
来源:互联网 发布:nginx location 正则 编辑:程序博客网 时间:2024/05/22 00:18
前言
本文首发【一名打字员】
上一节我们刚刚介绍完node的HTTP和HTTPS模块,相信我们也对nodejs有了更深层次的理解,接下来紧接着上一节的内容继续继续。
模块概述
- URL
在我们处理HTTP请求时,URL模块是我们使用频率最高的,因为它可以帮助我们更快的解析、生成和拼接URL。
URL提供了一个parse
方法,可以将url变成一个对象。
let url = require('url')url.parse('http://www.mrpann.cn:8080/p/a/t/h?query=string#hash'); =>{ protocol: 'http:', host: 'www.mrpann.cn:8080', port: '8080', hostname: 'www.mrpann.cn', hash: '#hash', search: '?query=string', query: 'query=string', pathname: '/p/a/t/h', path: '/p/a/t/h?query=string', href: 'http://www.mrpann.cn:8080/p/a/t/h?query=string#hash' }
通过上面的方法,我们可以很轻松的拿到请求地址中有关的信息,同时,我们也能通过使用format
方法,将一个URL对象格式化成一个请求地址。这个时候有的童鞋问了,打字员大大,我想拼接url怎么办呢,除了原始的+
来拼接之外,我们还可以用resolve
。示例如下:
url.resolve('http://www.mrpann.cn/api', '../user');=>/* http://www.mrpann.cn/api/user */
- QUERY STRING
在实际运用中,当我们客户端发送请求的时候,我们往往URL参数字符串与参数对象的互相转换。querystring就是为此而生的,举个例子,当我们使用get方法请求一张图片的时候,url地址为www.mpann.cn/resourse/img/user?type=img&isHistory=2
。我就可以使用querystring.parse
方法,转换为{ type: 'img', isHistory: 2 }
。
同理,我们也能够使用querystring.stringify
将参数对象转换为url字符串。 - ZLIB
当我们开发一个稍微庞大的系统的时候,往往某个请求中需要发送比较大的数据给服务端或者返回稍大的数据给客户端,但是往往因为数据量过大,导致请求失败或者后台无法接收。这个时候我们就可以使用zlib这个模块,它提供了数据压缩和解压的功能,通过zlib我们能很方便的压缩HTTP响应体数据。在下面这个示例中我们展示了如何使用zlib这个模块。
//服务端http.createServer(function (request, response) { var body = [] var headers = request.headers //判断是否支持gzip if(headers['accept-encoding'] || '').indexOf('gzip') != -1){ zlib.gzip(data, function (err, data) { response.writeHead(200, { 'Content-Type': 'text/plain', 'Content-Encoding': 'gzip' }); response.end(data); }); }else { response.writeHead(200, { 'Content-Type': 'text/plain' }); response.end(data); } console.log(request.headers) request.on('data', function (chunk) { body.push(chunk) }) request.on('end', function () { body = Buffer.concat(body) console.log(body.toString()) })}).listen(8080)//监听8080端口//客户端//request模块请求//构建请求头信息var options = { hostname: 'www.mrpann.cn', port: 8880, path: '/api/v1/user/login', method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8', 'Accept-Encoding': 'gzip, deflate' },}//发起服务端请求var request = http.request(options, function(result) { var body = [] result.on('data', function (chunk) { body.push(chunk) }); result.on('end', function () { body = Buffer.concat(body) var headers = result.headers //判断是否支持gzip压缩 if (headers['content-encoding'] === 'gzip') { //进行解压响应体 zlib.gunzip(body, function (err, data) { console.log(data.toString()); }); } else { console.log(data.toString()); } }); }) request.on('error', function (e) {}) //写入请求体内容 request.write(qs.stringify({username:userName,password:pwd,captcha:cap})) request.end()
- NET
接触过其它语言网络编程这一块的童鞋应该比较熟悉socket。nodejs里面有没有呢,答案是肯定的。我们利用net模块可以创建一个socket服务端或者是客户端。但是由于前端的局限性,据本猿所知,使用socket的应用场景还很少,在这里仅仅展示一下利用net来创建一个简单的客户端和服务端应用。
//服务端应用net.createServer(function (conn) { conn.on('data', function (data) { conn.write([ 'HTTP/1.1 200 OK', 'Content-Type: text/plain', 'Content-Length: 11', '', 'Hello World' ].join('\n')); });}).listen(8080);//客户端应用var options = { port: 8080, host: 'www.example.com' };var client = net.connect(options, function () { client.write([ 'GET / HTTP/1.1', 'User-Agent: curl/7.26.0', 'Host: www.baidu.com', 'Accept: */*', '', '' ].join('\n')); });client.on('data', function (data) { console.log(data.toString()); client.end();});
结语
到这里我们的网络模块基本上就结束了。在这一模块里面我们知道了以下几点内容
- 我们能够很方便的通过http和https进行一个客户端的请求与搭建一个服务端应用
- 处理http请求时往往回家上url.parse方法
- 可以通过request和response对象来读写对应的数据
- node中支持压缩和解压数据以及支持socket编程
- 人生无奈,我用node
下一次我们的入门到放弃node系列分享点什么呢,请发送到公众号后台一起投票吧!
阅读全文
0 0
- 入门到放弃node系列之网络模块(二)
- 入门到放弃node系列之网络模块(一)
- 入门到放弃node系列之公众号开发实战二(Express篇)
- 入门到放弃node系列统一声明
- 入门到放弃node系列之微信公众号开发实战一(Express篇)
- 入门到放弃node系列之MySQL数据库的简单使用
- Docker 从入门到放弃(二)之Spring Boot
- JSP--(二)从入门到放弃
- JavaScript从入门到放弃(二)
- Python 从入门到放弃(二)
- 自制小四轴:从入门到放弃——基于stm32的小四轴系列(二)
- Node.js从入门到放弃
- android之RxJava的学习,从浅到深,从入门到别放弃(二)
- Python爬虫从入门到放弃(二十四)之 Scrapy登录知乎
- Python爬虫从入门到放弃(二十四)之 Scrapy登录知乎
- Python爬虫从入门到放弃(二十四)之 Scrapy登录知乎
- 自制平衡小车:从入门到放弃——基于stm32的平衡小车系列(二)
- js从入门到放弃之入门(一)
- 在Spring的XML文件中通过命名空间配置的标签是怎么解析的?
- spring mvc 报错 expected at least 1 bean which qualifies as autowire candidate for this depende (201
- 范数(L21,L2,核范数)
- asp.net(一)——c#基础
- 华为张延德:智慧城市是必然趋势 | 洞见2018中国HR服务峰会惊艳业界
- 入门到放弃node系列之网络模块(二)
- 盒子模型初学
- 浅谈产品生态的力量
- scanf_s函数 (c++)
- mysql索引背后的数据结构及算法
- bitnami redmine修改网页访问端口
- 【Java基础总结】-Java笔试易错点 第一篇
- tf.Tensor.eval()
- JavaScript 垃圾收集机制