一、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模块相关推荐

  1. nodejs没有net模块_Node.js实战16:用http模块创建web服务器

    Nodejs的http模块,是基于net.server,经过c++二次封装,也是nodejs的核心模块. 功能比net.server更强,可解析和操作更多细节内容,如值.content-length. ...

  2. Nodejs中的模块系统

    一.模块化的定义 ①具有文件作用域 ②具有通信规则:加载和导出规则 二.CommonJS模块规范 1.nodejs中的模块系统,具有文件作用域,也具有通信规则,使用require方法加载模块,使用ex ...

  3. nodejs的mysql模块_Nodejs的mysql模块学习(一)

    介绍 mysql npm包 是一个nodejs的模块,由JavaScript编写 安装 npm install mysql 建立连接 var mysql = require('mysql');//引用 ...

  4. Nodejs全局安装模块后找不到命令的解决方法

    Nodejs全局安装模块后找不到命令的解决方法 参考文章: (1)Nodejs全局安装模块后找不到命令的解决方法 (2)https://www.cnblogs.com/xiaoyucoding/p/1 ...

  5. Nodejs的url模块方法

    Nodejs的url模块方法 nodejs里面的一个简单的模块,url模块.这个url的模块要使用的话需要先引入.若只是在命令行里比如cmd或git bash 等使用url这个模块的话,是不需要req ...

  6. nodejs中的模块的理解

    nodejs所谓的模块就是一个文件,或者是匿名函数.(CommonJs) require exports module.exports. 为什么直接console.log(typeof require ...

  7. NodeJS 之 fs 模块(文件操作)

    NodeJS 之 fs 模块(文件系统模块) 参考 描述 fs(File System) 文件 读取 fs.readFile() 判断文件是否读取成功 编码 写入 fs.writeFile() 覆盖 ...

  8. NodeJS 之 fs 模块(路径动态拼接问题)

    NodeJS 之 fs 模块(路径动态拼接问题) 参考 描述 问题 描述 准备工作 content.txt main.js 复现 前奏 惊雷 再探 分析 解决 __dirname path 模块 pa ...

  9. nodejs安装ffi模块调用dll详解

    网上很多关于nodejs安装ffi的模块讲的条理实在太不清晰了,nodejs使用的VC++运行库对于不同的nodejs版本是不一致的.nodejs10需要的vs版本是vs2015. 1 安装vs201 ...

最新文章

  1. c#获取电脑硬件信息参数说明(硬盘篇 Win32_DiskDrive)
  2. 虚成员(virtual)
  3. LeetCode 1966. Binary Searchable Numbers in an Unsorted Array
  4. python成绩统计_python统计考试成绩排名
  5. mysql 视图报错_MySQL使用Union创建视图报错
  6. Gstreamer之可变长参数实现(十)
  7. 静态成员对比实例成员(static修饰符解析)
  8. 启动Delphi2010就出现‘displayNotification: 堆栈溢出’
  9. psp模拟器完美字库_安卓PSP模拟器评测:讨鬼传
  10. MATLAB如何打开chm文件
  11. SQL进阶篇之多表联查
  12. Linux用户与内核空间交互—procfs
  13. idea弹窗 Placing the unmodified important.txt in the zip file with the agent jar in the same directo
  14. 计算机课程 图层关系认识 课件,PhotoShop系列视频讲座(八讲)
  15. python循环展示大写字母_python调用大写函数python中字典的循环遍历的两种方式
  16. @程序员,请掌握这些核心生存技能
  17. 视频教程-沐风老师3DMAX基础入门-3Dmax
  18. MapReduce程序中的万能输入FileInputFormat.addInputPaths
  19. python系统命令切换目录_windows cmd 指令 怎么切换目录
  20. Linux下文件比对功能

热门文章

  1. Checkly如何借助Terraform实现零宕机部署
  2. 工业大数据分析平台的应用价值探讨
  3. oracle常用sql命令
  4. pyhon学习问题汇总
  5. C#编程(十六)----------匿名类型
  6. ubuntu set ntpdate
  7. MATLAB获取一个目录中的所有文件
  8. postgis学习笔记
  9. EDM营销中HTML邮件设计的技巧
  10. 虚方法、重写方法和抽象方法[转载]