nodejs模块之http&&url
我们使用nodejs中的http模块来进行网络操作
一、什么是HTTP协议:
超文本传输协议(HyperText Transfer Protocol)HTTP假定其下层协议提供可靠传输。
因此,任何能够提供这种保证的协议都可以被其使用。因此也就是使用TCP作为其传输层。
二、HTTP请求和响应报文的结构:
HTTP请求的结构:
请求行 GET /images/logo.gif HTTP/1.1 表示从/images目录下请求logo.gif这个文件
---------------------------------------------------------------------------------
请求头 Accept-Language:en……
---------------------------------------------------------------------------------
空行 区分请求头和请求主体
---------------------------------------------------------------------------------
请求主体 请求中的内容
HTTP响应的结构:
响应行: HTTP/1.1 200 OK
版本号 状态码 相应文本
---------------------------------------------------------------------------------
响应头: content-length:16……
---------------------------------------------------------------------------------
空行 区分响应头和响应主体
---------------------------------------------------------------------------------
响应主体 响应中的内容
三、hTTP协议的特点:
无状态、无连接、HTTP允许传输任意类型的数据对象
简单来说就是无法像我们打电话那样你说一句,我说一句,可以持续通话,而HTTP协议只能做到你说一句,然后我说一句,只后想要通话只能再次建立连接。
然后HTTP对传输数据的的类型不限制,可以是任意类型的。
四、HTTP模块
1、
http.createServer([requestListener]) 创建一个监听server,会返回一个http.Server对象,参数requestListener会作为request事件的回调函数,
该回调函数第一个参数为http.IncomingMessage实例,第二个参数为http.ServerResponse实例
http.IncomingMessage 一个对象,封装了客户端发送过来的请求
http.ServerResponse 响应对象
2、http.Server对象的方法:
on:给监听server添加事件处理函数
listen:使用服务器监听端口
http.Server支持的事件:
request:有请求到来时触发回调函数
close:服务器关闭时触发
3、http.IncomingMessage对象的重要属性、事件和方法:
属性:
req.headers:请求头
req.url:请求路径
req.method:请求方法
req.httpVersion:http协议的版本
事件:
data:接受到请求主体中的内容时会触发
end:请求主体内容接受完毕时触发
这两个配合获取请求主体全部内容
"use strict"; const http = require('http'); const server = http.createServer(function (req, res) {
// console.log(req.headers);
// console.log(req.url);
// console.log(req.method);
// console.log(req.httpVersion); // 获取请求主体内容
let body = '';
req.on('data', function (thunk) {
body += thunk;
});
req.on('end', function () {
console.log(body);
res.setHeader('Content-Type', 'text/html');
res.end('<h1>' + body + '</h1>');
}); });
server.listen(3000);
console.log('server is running in localhost:3000……');
4、http.ServerResponse对象方法:
res.end([data][,encoding][,callback]) 用于声明整个请求已经发送完毕,同时也可以响应发送数据,每个响应必须调用一次,否则会导致请求持续连接不断的状态
res.write(chunk[,encoding][,callback]) 用于往请求主体汇总写入数据,并且调用了这个方法后,响应头以及响应行也不能再操作了(在end前分多次发送数据,必须在end前调用)
res.statusCode <Number> 可操作响应状态码(eg:200,404)(状态码和浏览器显示内容没有关系,一般都是后端设定商量好的,可以是404,单页面显示正常)
res.statusMessage <string> 可操作响应状态信息
res.writeHead(statusCode[,statusMessage][,headers]) 设置请求头部,可以同时设置statusCode、statusMessage、headers,其中headers为一个对象
"use strict"; const http = require('http'); const server = http.createServer(function (req, res) {
// 设置响应状态码
res.statusCode = 200;
// 设置响应状态信息
res.statusMessage = 'req success';
// 设置响应头
res.setHeader('Content-Type', 'text/html');
// 响应数据,可分多次写入
res.write('<h1>write01</h1>');
res.write('<h1>write02</h1>');
// 响应
res.end('<h1>end</h1>');
}); server.listen(3000);
console.log('server is running in localhost:3000……');
五、url模块
url.parse(urlString[,parseQueryString[,slashesDenoteHost]]) 将一个urlString进行解析
第一个参数是url,第二个参数是一个boolean值,如果为true,则会将url中query解析为一个object返回,如果为false,则返回的query属性值则为一个未解析、未编码的string,默认为false
"use strict"; const http = require('http');
const url = require('url'); const server = http.createServer(function (req, res) {
const urlObj = url.parse(req.url, true);
console.log(urlObj);
res.end('<h1>parse urlString</h1>');
}); server.listen(3000);
console.log('server is running in localhost:3000……');
打印结果为:(标红属性是我们常用的)
Url {
protocol: null,
slashes: null,
auth: null,
host: null,
port: null,
hostname: null,
hash: null,
search: '?name=lyl&age=18',
query: { name: 'lyl', age: '18' },
pathname: '/mypage/page01',
path: '/mypage/page01?name=lyl&age=18',
href: '/mypage/page01?name=lyl&age=18'
}
使用如上这些知识,我们做很多东西:
1、使用url.parse(req,url, true)来解析url,然后根据不同的url来做出不同的响应。
2、我们可以根据不同的url进行路由选择,使用fs模块读取不同html模板文件,获取响应数据,然后对客户端做出响应,从而显示不同页面和数据。
这是最简单的原理,但实现起来从优化、速度等方面总会产生很多问题,但总来来说原理都是这样。
-------------------------------------------------------------------------------------------------------------------------end
nodejs模块之http&&url的更多相关文章
- nodejs入门API之url模块+querystring模块
关于URL的一些基础内容 URL模块的API解析 URL的参数URLSearchParams类 querystring模块 一.关于URL的一些基础内容 1.1 定义: 在WWW上,每一信息资源都有统 ...
- NodeJS 模块开发及发布详解
NodeJS 是一门年轻的语言,扩展模块并不太全,经常我们想用某个模块但是却找不到合适的.比如前两天我需要使用hmac和sha1来做签名,就没有找到一个比较好用的模块,这时候就需要我们自己来实现相应的 ...
- NodeJS模块、包、NPM
1.NodeJS模块 每一个Nodejs都是一个NodeJS模块,包括JS文件,JSON文本文件,二进制模块文件. a.模块的应用 新建一个文件mytest. ...
- # nodejs模块学习: express 解析
# nodejs模块学习: express 解析 nodejs 发展很快,从 npm 上面的包托管数量就可以看出来.不过从另一方面来看,也是反映了 nodejs 的基础不稳固,需要开发者创造大量的轮子 ...
- nodejs模块——http模块
http模块主要用于创建http server服务. 本文还用到url模块和path模块,还有fs模块.url模块用于解析url,path模块用于处理和转换文件路径. 一.简单应用 代码如下: // ...
- nodejs模块xml2js解析xml的坑
在一个项目中,用到nodejs模块xml2js解析xml,xml的数据如下: <xml> <MsgId>6197906553041859764</MsgId> &l ...
- NodeJS 模块&函数
NodeJS 模块&函数 nodejs的多文件操作通过模块系统实现,模块和文件一一对应.文件本身可以是javascript代码.JSON或编译过的C/C++扩展 基本用法 nodeJS通过ex ...
- es6模块 nodejs模块和 typescript模块
es6模块 import和export nodejs模块 require和module.exports typescript模块 module和export
- nginx unit nodejs 模块试用
unit 对于nodejs 的支持是在10.25 发布的,基本能用,但是依然有好多问题,当前在测试的时候就发现,请求之后会block , 相关的issue 已经有人反馈了,最好使用源码编译,方便测 ...
随机推荐
- Atitit. 高级软件project师and 普通的差别 高级编程的门槛总结
Atitit. 高级软件project师and 普通的差别 高级编程的门槛总结 1. 完备的知识体系 2 2. 编程理论/原理的掌握 2 1.1. 掌握经常使用的概念(ORM,IOC.AOP,eve ...
- MD5值转换(Hex 32位 <-> base64 24位)
关于MD5值的原理本文不在介绍,本文主要介绍MD5值的两种编码的相互转换(32位和BASE64编码的24位),实际应用过程中经常会涉及到两种编码的相互转换.快熟使用工具tomeko.net. C#示例 ...
- Atitit.jdk java8的语法特性详解 attilax 总结
Atitit.jdk java8的语法特性详解 attilax 总结 1.1. 类型推断这个特别有趣的.鲜为人知的特性1 2. Lambda1 2.1. 内部迭代意味着改由Java类库来进行迭代,而不 ...
- java多线程编码注意事项
Sole purpose of using concurrency is to produce scalable and faster program. But always remember, sp ...
- 【数据挖掘】分类之decision tree(转载)
[数据挖掘]分类之decision tree. 1. ID3 算法 ID3 算法是一种典型的决策树(decision tree)算法,C4.5, CART都是在其基础上发展而来.决策树的叶子节点表示类 ...
- Ueditor编辑器图片上传到万象优图
最近想用typecho做一个个人博客站,typecho的文本编辑器不能上传图片,我就用Ueditor替换的了原来的文本编辑器,听说腾讯的万象优图每月有50G的免费空间和流量,我就自己改了下Uedito ...
- spring mvc数据验证
今天来说一下.前段验证,与后端数据验证.大家都知道.在我们.注册与登陆的时候,往往需要对数据进行效验.那么前段我们都知道,可以使用,js去做处理. 今天主要讲解.后端的数据效验.这里我们采用Hiber ...
- 最小生成树——Prim(普利姆)算法
[0]README 0.1) 本文总结于 数据结构与算法分析, 源代码均为原创, 旨在 理解Prim算法的idea 并用 源代码加以实现: 0.2)最小生成树的基础知识,参见 http://blog. ...
- Unity 游戏对象消失 enable,destroy与active的区别
gameObject.SetActive(false):是否在场景中停用该物体,停用后Hierarchy窗口呈灰色,用Find函数也找不到.如果该物体有子物体,要用SetActive Recursir ...
- 四边形不等式优化DP——石子合并问题 学习笔记
好方啊马上就要区域赛了连DP都不会QAQ 毛子青<动态规划算法的优化技巧>论文里面提到了一类问题:石子合并. n堆石子.现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆石子合并成新的 ...