Nodejs的http模块
一、http服务器
我们知道传统的HTTP服务器是由Aphche、Nginx、IIS之类的软件来搭建的,但是Nodejs并不需要,Nodejs提供了http模块,自身就可以用来构建服务器。例如,下面的代码就是使用Nodejs搭建了一个简易的服务器:
/***main.js*在终端输入node main.js,打开浏览器在地址栏输入localhost:3000*浏览器显示Hello Nodejs*///获取http模块 var http = require("http"); //获取http.Server对象 var server = new http.Server();//创建服务器,并监听3000端口 server.on("request",function(req,res) {res.writeHead(200,{"content-type":"text/plain"});res.write("Hello Nodejs");res.end(); }).listen(3000);
http模块中封装了一个HTTP服务器和一个简易的HTTP客户端:使用http.Server类创建一个基于事件的HTTP服务器,而使用http.request()和http.get()方法则可以作为HTTP客户端向服务器发起请求。
上面的示例代码创建了一个http.Server对象,然后为其添加request事件监听,这个事件会在每次接收到请求时触发。text/plain的意思是将文件设置为纯文本格式,浏览器在获取到这种文件时并不会对其进行处理,如果将content-type设置为text/html,浏览器在获取到这种文件时会自动调用HTML的解析器对文件进行相应的处理。另外,也可以使用createServer()方法简化这一过程:
var http = require("http");//createServer()方法创建的http.Server对象默认添加了一个request事件监听 http.createServer(function(req,res) {res.writeHead(200,{"content-type":"text/plain"});res.write("Hello Nodejs");res.end(); }).listen(3000);
上面说到了http.Server类的事件,http.Server类最常用的事件是"request"事件。在"request"事件中,传入回调函数的参数req和res分别是http.IncomingMessage类(它实现了可读流的接口)和http.ServerResponse类(它实现了可写流的接口)的实例。
1、IncomingMessage对象包含了从客户端发来的http请求信息,它可以用来访问响应状态、消息头、以及数据等,例如:
var http = require("http");http.createServer(function(req,res) {console.log(req.httpVersion);//http协议版本,可能的值有"1.1"或"1.0"console.log(req.method);//请求的方法,例如"GET"、"POST"等console.log(req.statusCode);//http响应状态码console.log(req.statusMessage);//http响应状态消息console.log(req.headers);//请求头或响应头的对象console.log(req.url);//发送http请求的客户端的url }).listen(3000);
IncomingMessage对象包含的事件、方法以及属性参考手册:http://nodejs.cn/api/http.html#http_class_http_incomingmessage
2、http.ServerResponse类是返回给客户端的信息,它有三个重要的方法,用于返回响应头、响应内容以及结束请求:
writeHead(statusCode[, statusMessage][, headers]):向请求的客户端发送响应头,该函数在一个请求中最多调用一次,如果不调用,则会自动生成一个响应头。statusCode是一个三位数的http状态码,如“200”表示请求成功、“404”表示请求的资源不存在;statusMessage是一个字符串,用来描述状态;headers是一个对象,即响应头。
write(chunk[, encoding][, callback]):向请求的客户端发送响应体,在end()方法被调用前可以多次调用。chunk是一个buffer或者字符串,如果chunk是字符串,则在第二个参数需要指定编码方式,默认为utf-8。
end([chunk][, encoding][, callback]):该方法会通知服务器,所有响应头和响应主体都已被发送,每次响应都必须调用end()方法来结束。
ServerResponse对象包含的事件、方法以及属性参考手册:http://nodejs.cn/api/http.html#http_class_http_serverresponse
http.Server类的事件参考手册:http://nodejs.cn/api/http.html#http_class_http_server
二、http客户端
http模块提供了http.request()和http.get()两个方法,功能是作为客户端向http服务器发起请求。
1、关于http.request(options[, callback])
options是一个对象,包含了请求的相关参数:http://nodejs.cn/api/http.html#http_http_request_options_callback
可选参数callback会作为单次监听器被添加到”response“事件,即当请求的响应被接收到时就会调用该回调函数。它在被执行时带有一个参数res,该参数是一个 http.IncomingMessage类的实例
返回值是一个http.ClientRequest 类的实例,它表示着一个正在处理的请求
例如:
/***c.js*HTTP客户端,发送HTTP请求*控制台输出返回的响应内容*/ var http = require("http"); var options = {host: "localhost",port: 3000 }var req = http.request(options,function(res) {res.on("data",function(chunk) {console.log(chunk.toString("utf-8"));});res.on("end",function() {console.log("----请求结束!----");}); });req.on("error",function(err) {console.log(err.message); });req.end();
/***s.js*HTTP服务器*/ var http = require("http");http.createServer(function(req,res) {res.writeHead(200,{"content-type":"text/plain"});res.write("Hello Nodejs");res.end(); }).listen(3000);
如果请求过程中遇到任何错误,则在返回的请求对象中会触发"error"事件;
使用http.request()必须总是调用req.end()来表明请求的结束,即使没有数据被写入请求体;
2、关于http.get(options[,callback])方法
http.get()方法是http.request()方法的简化版,主要区别是http.get()自动将请求方法设为了"GET",同时不需要手动调用req.end()。
三、总结
Nodejs的http模块常用的类和方法:
1、http.Server 类:用于创建HTTP服务器,使用时需要先实例化;
2、http.ClientRequest 类:该对象在 http.request() 内部被创建并返回。它表示着一个正在处理的请求;
3、http.IncomingMessage 类:IncomingMessage对象由 http.Server 或 http.ClientRequest 创建,并作为第一个参数分别传递给 'request' 和 'response' 事件。 它可以用来访问响应状态、消息头、以及数据。它实现了可读流接口;
4、http.ServerResponse 类:ServerResponse对象由http.Server创建,并作为第二个参数传递给 'request' 事件。它实现了可写流接口;
5、http.createServer( [callback] )方法:返回一个http.Server对象,callback会被自动添加到 'request' 事件中;
6、http.request( options[, callback] )方法:作为http客户端,向服务器发送请求,可选参数callback会被自动添加到 'response'事件中;
7、http.get( options[, callback] )方法:http.request()方法的简化版,主要区别是http.get()自动将请求方法设为了"GET",同时不需要手动调用req.end();
引用出处:Nodejs的http模块 - 沉江、小鱼 - 博客园 https://www.cnblogs.com/blog-cxj2017522/p/7044538.html
转载于:https://www.cnblogs.com/ning123/p/11333261.html
Nodejs的http模块相关推荐
- nodejs没有net模块_Node.js实战16:用http模块创建web服务器
Nodejs的http模块,是基于net.server,经过c++二次封装,也是nodejs的核心模块. 功能比net.server更强,可解析和操作更多细节内容,如值.content-length. ...
- Nodejs中的模块系统
一.模块化的定义 ①具有文件作用域 ②具有通信规则:加载和导出规则 二.CommonJS模块规范 1.nodejs中的模块系统,具有文件作用域,也具有通信规则,使用require方法加载模块,使用ex ...
- nodejs的mysql模块_Nodejs的mysql模块学习(一)
介绍 mysql npm包 是一个nodejs的模块,由JavaScript编写 安装 npm install mysql 建立连接 var mysql = require('mysql');//引用 ...
- Nodejs全局安装模块后找不到命令的解决方法
Nodejs全局安装模块后找不到命令的解决方法 参考文章: (1)Nodejs全局安装模块后找不到命令的解决方法 (2)https://www.cnblogs.com/xiaoyucoding/p/1 ...
- Nodejs的url模块方法
Nodejs的url模块方法 nodejs里面的一个简单的模块,url模块.这个url的模块要使用的话需要先引入.若只是在命令行里比如cmd或git bash 等使用url这个模块的话,是不需要req ...
- nodejs中的模块的理解
nodejs所谓的模块就是一个文件,或者是匿名函数.(CommonJs) require exports module.exports. 为什么直接console.log(typeof require ...
- NodeJS 之 fs 模块(文件操作)
NodeJS 之 fs 模块(文件系统模块) 参考 描述 fs(File System) 文件 读取 fs.readFile() 判断文件是否读取成功 编码 写入 fs.writeFile() 覆盖 ...
- NodeJS 之 fs 模块(路径动态拼接问题)
NodeJS 之 fs 模块(路径动态拼接问题) 参考 描述 问题 描述 准备工作 content.txt main.js 复现 前奏 惊雷 再探 分析 解决 __dirname path 模块 pa ...
- nodejs安装ffi模块调用dll详解
网上很多关于nodejs安装ffi的模块讲的条理实在太不清晰了,nodejs使用的VC++运行库对于不同的nodejs版本是不一致的.nodejs10需要的vs版本是vs2015. 1 安装vs201 ...
最新文章
- c#获取电脑硬件信息参数说明(硬盘篇 Win32_DiskDrive)
- 虚成员(virtual)
- LeetCode 1966. Binary Searchable Numbers in an Unsorted Array
- python成绩统计_python统计考试成绩排名
- mysql 视图报错_MySQL使用Union创建视图报错
- Gstreamer之可变长参数实现(十)
- 静态成员对比实例成员(static修饰符解析)
- 启动Delphi2010就出现‘displayNotification: 堆栈溢出’
- psp模拟器完美字库_安卓PSP模拟器评测:讨鬼传
- MATLAB如何打开chm文件
- SQL进阶篇之多表联查
- Linux用户与内核空间交互—procfs
- idea弹窗 Placing the unmodified important.txt in the zip file with the agent jar in the same directo
- 计算机课程 图层关系认识 课件,PhotoShop系列视频讲座(八讲)
- python循环展示大写字母_python调用大写函数python中字典的循环遍历的两种方式
- @程序员,请掌握这些核心生存技能
- 视频教程-沐风老师3DMAX基础入门-3Dmax
- MapReduce程序中的万能输入FileInputFormat.addInputPaths
- python系统命令切换目录_windows cmd 指令 怎么切换目录
- Linux下文件比对功能