node常用内置模块之http模块

目录

1.http协议

1.1 http协议的概念

1.2 http协议传输数据的方式

1.3 http请求格式

1.3.1 http请求方法

 1.4 http响应

1.4.1http响应状态码:

1.5 http流程总结

1.6 http协议的特点

2.http模块

扫描二维码关注公众号,回复: 11051348 查看本文章

2.1 NodeJS模块

1.创建服务器对象

         2.创建请求处理函数

         3 设置服务监听

                  4.一个小小的案例

2.2 获取客户端请求方式

1.请求对象的常用属性

2.3 HTTP响应的内容

1.http响应的常用属性:

2.可以利用writeHead方法来发送响应头

         3. setHeader 设置响应头

         4.write方法

         5.end方法

4.  node热更新


1.http协议

在介绍http模块之前我们先来了解一下http协议的相关知识.

网络是信息传输,接收,共享的虚拟平台,通过它把各个点,面,体的信息联系到一起,从而实现这些资源的共享 网络传输数据有一定的规则,这些规则我们称为协议,HTTP就是规则中的一种,而且使用最为频繁是一种协议 .

1.1 http协议的概念

HTTP是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议。超文本传输协议传输的内容就是超文本的标记语言(文字,图片,视频,音频...) 它是TCP/IP协议之上的一个应用层协议,用于定义web浏览器与web服务器之间交换数据的过程以及数据本身的格式

1.2 http协议传输数据的方式

 HTTP协议是一种网络传输协议,采用的是请求/应答 方式传递数据,一次请求对应一次应答(响应).

一次http请求的基本流程是,有客户端向服务端发起一次请求(request), 而服务器在接收到以后返回给客户端一个响应(response)。所以一次完整的http请求包含请求和响应两部分。

当我们发送http请求时,通过URL(全球统一资源定位符)对网络资源进行定位

URL(Uniform Resource Locator),中文叫统一资源定位符。是用来标识某一处资源的地址。也即是我们常说的网址。以下面这个URL为例,介绍下普通URL的各部分组成: 协议+域名(端口默认80)+路径+参数

1.3 http请求格式

客户端发送一个HTTP请求到服务器的请求消息包括以下部分:请求行,请求头,空行和请求数据。 

 

 http请求报文格式:

1.3.1 http请求方法

根据http标准,http定义了多种请求方式,常用的有get和post.

  1. GET 1.主要是负责从服务器获取数据 2.URL中添加请求参数,显示在地址栏 3.请求字符串限制 1024个字节 比`POST`更加高效和方便。
  2. POST1.主要负责向服务器提交数据 2.没有大小限制 比'GET'传递数据量大,安全性高
序号 方式 描述
1 GET 请求指定的页面信息,并返回实体主体
2 HEAD 类似于 GET 请求, 只不过返回的响应中没有具体的内容(没有正文), 用于获取头部/报头
3 POST 向指定资源提交数据进行处理请求(例如提交表单或者上传文件). 数据被包含在请求体中. POST 请求可能会导致新的资源的建立和/或已有资源的修改. 
4 PUT 从客户端向服务器传送的数据取代指定的文档的内容
5 DELETE 请求服务器删除指定的页面
6 CONNECT HTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器
7 OPTIONS 允许客户端查看服务器的性能
8 TRACE 回显服务器收到的请求,主要用于测试或诊断
9 PATCH 是对put方法的补充,用来对已知资源进行j

 1.4 http响应

HTTP响应也由四个部分组成,分别是:状态行、消息报头、空行和响应正文

 

http响应报文格式: 

1.4.1http响应状态码:

当客户端向服务端发起一次请求后,服务端在返回的响应头中会包含一个HTTP状态码。

HTTP的状态码是由三位数字来表示的,由第一位数字来表示状态码的类型,一般来说有五种类型:

分类 描述
1** 信息,服务器收到请求,需要请求者继续执行操作
2** 成功,操作被成功接收处理
3** 重定向,需要进一步操作已完成请求
4** 客户端错误,请求包含语法错误或无法完成请求,最常见的404
5** 服务器错误,服务器在处理请求的过程中发生了错误

1.5 http流程总结

1.6 http协议的特点

  1. HTTP是无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
  2.  HTTP是媒体独立的:这意味着,只要客户端和服务器知道如何处理的数据内容,任何类型的数据都可以通过HTTP发送。 
  3. HTTP是无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。

2.http模块

http模块是一个 nodejs 中用于网络通信的模块

2.1 NodeJS模块

1.创建服务器对象

const http = require('http');
const server = http.createServer();

2.创建请求处理函数

有两种方式创建请求处理函数:

  1. 创建服务端对象通过回调函数的方式
  2. 通过request 事件处理函数

1.通过回调函数的方式创建服务端对象

let app = http.createServer((require,response)=>{
    require.write('hello world');
})
console.log(app);

2.通过createServer的方式创建服务端对象

//通过createServer的方式创建服务对象
let app = http.createServer();
// console.log(app)
app.on('reqeust',function(req,res) {
    console.log(123)
})

3 设置服务监听

通过listen的方式设置服务监听

listen接受四个参数:

server.listen(port [, host] [,backlog] [, callback])

  1. prot 必需的 监听的端口号

  2. host 可选的 监听指定的地址(一般省略)

  3. backlog 可选, 参数是一个指定等待客户端连接的最大数量, 默认511( 一般不使用)

  4. callback 可选, 用于在服务器监听启动成功后执行的回调函数                                                                                                                                                                                                                                 

//通过createServer的方式创建服务对象
let app = http.createServer();
// console.log(app)
app.on('reqeust',function(req,res) {
    console.log(123)
})

// 监听端口
function listen(){
    app.listen(3000,function(){
        console.log("Server start at 3000 port")
    })
}
listen()

listen方法的callback参数也可以单独去处理,因为服务器监听启动成功后,会自动触发listening事件,那么我们就可以通过绑定listening事件在事件的回调函数里处理

app.on('listening' ,function () {
    console.log(11)
})

 4.一个小小的案例

值得注意的是:每次当我们的文件内容改变之后都应该断开服务器然后重启

//引入通信模块
const http  = require('http');
//创建服务器
const server = http.createServer();
//绑定事件
server.on('request',function (request,response) {
    //request : 请求对象,包含了客户的所有信息,包括请求头,请求主体等
    //response : 响应对象,包含了服务器发送给客户的所有信息,响应头,响应主体等
    //解决有可能会出现的乱码问题
    response.setHeader("Content-Type", "text/html;charset=utf-8")
    response.end('<h2>我是小仙女</h2>')
})

//监听服务器
server.listen(3000,function() {
    console.log('服务器启动成功');
})

 启动服务器,在浏览器上访问

 补充:出现乱码的解决方式:

如果出现乱码,可以设置响应头解决

// 这是设置响应头,防止出现乱码(两种方法都可以)
// res.writeHead(200, { 'Content-Type': 'text/html;charset=UTF-8' });
res.setHeader('Content-Type', 'text/html;charset=UTF-8');

2.2 获取客户端请求方式

在接受到客户端发送的请求是,调用的回调函数的第一个蚕食值是一个httpInconmingMessage对象该对象是用于读取客户端请求流中的数据.

server.on("request", (req,res) => {
    console.log(req)
    res.end("数据")
})

1.请求对象的常用属性

  • method属性

值是一个字符串, 为客户端向服务器发送请求时使用的的方法, 常用的强求有"GET","POST"

server.on("request", (req,res) => {
    console.log(req.method) // 打印请求方式
})

 打印出请求的方式为GET

  • url属性

url 属性值为客户端发送请求时使用URL参数字符串

server.on("request", (req,res) => {
    console.log(req.url)
})

 打印出两条信息第一个是请求的路径,第二个是请求网页标题的小图标.

 

  • header属性

该属性值为客户端发送的请求头,其中存放了客户端发送的所有请求信息,包括cookie 信息及浏览器信息

server.on("request", (req,res) => {
    console.log(req.headers)
})

2.3 HTTP响应的内容

在接收到用户请求的回调函数或request事件处理函数中的第二个参数值是一个http.ServerResponse对象,可以利用该对象发送内容给客户端及服务器短的额响应流.

server.on("request", (req,res) => {
    console.log(res)
    res.end("数据")
})

1.http响应的常用属性:

  1. writeHead : 设置有状态码的响应头信息
  2. setHeader : 设置单个响应头字段
  3. write : 发送响应数据
  4. end : 结束响应

2.可以利用writeHead方法来发送响应头

writeHead方法接受三个参数:

  1. statusCode : 第一个参数,必须传递,执行一个http状态码
  2. reasonPhrase : 第二个参数可选,就是对状态码的描述信息,是一个字符串,一般不会用到
  3. header : 第三个参数可选,参数值是一个对象,用来配置响应头信息
server.on("request", (req,res) => {

    // 设置响应头信息
    res.writeHead(200,'ok',{
        'Content-Type': 'text/html;charset=utf8'
    })

    res.end("响应数据")
})

响应头的常用属性:

  1. content-type: 指定响应内容的的类型

  2. location : 用于将客户端重定向到另外一个ur l地址

  3. set-cookie: 用于在客户端创建cookie

  4. access-control-allow-origin: 解决跨域问题

 res.writeHead(200,{
    'Content-Type': 'text/html;charset=utf8',
     'Set-Cookie': 'name=pp;password = 123456'
 })

3. setHeader 设置响应头

接受两个参数

  1. name: 响应头的字段

  2. value: 响应头的值

 res.setHeader('Content-Type', 'text/html;charset=utf8')

setHeader 每次只能设置一个响应头字段, writeHead可以一次设置多个响应头字段

4.write方法

write 方法 发送响应内容,可以多次调用

server.on("request", (req,res) => {
    res.setHeader('Content-Type', 'text/html;charset=utf8')

    res.write("响应数据")
    res.write("响应数据2")
    res.write("响应数据3")
  
})

5.end方法

end 方法, 在每次数据发送完毕后通过end方法来结束响应

server.on("request", (req,res) => {
    res.setHeader('Content-Type', 'text/html;charset=utf8')

    res.write("响应数据")
    res.write("响应数据2")
    res.write("响应数据3")
  
    // 结束响应
    res.end()
})

同时我们也可以给end传参数,表示在结束响应的时候最后一次给客户端响应的内容

server.on("request", (req,res) => {
    res.setHeader('Content-Type', 'text/html;charset=utf8')
  
    // 结束响应
    res.end("响应内容")
})

4.  node热更新

我们发现每一次修改都需要重新用node服务器启动,如果不希望这样,就可以使用热更新.

下载nodemon 包

npm i -g nodemon

安装完成后就可以用nodemon替代node启动

nodemon example.js

 修改内容之后就不需要再次手动启动服务器

发布了34 篇原创文章 · 获赞 145 · 访问量 7183

猜你喜欢

转载自blog.csdn.net/lhrdlp/article/details/105535842