NodeJs-http模块

目录

  • 一、概念
  • 二、请求报文的组成
  • 三、响应报文的组成
  • 四、创建http服务
    • 4.1 操作步骤
    • 4.2 注意事项
  • 五、获取 HTTP 请求报文
    • 5.1 获取请求报文
    • 5.2 提取路径和查询字符串
  • 六、设置 HTTP 响应报文
  • 七、MIME设置资源类型

一、概念

HTTP(hypertext transport protocol)协议;中文叫超文本传输协议
是一种基于TCP/IP的应用层通信协议
这个协议详细规定了 浏览器 和万维网 服务器 之间互相通信的规则。
协议中主要规定了两个方面的内容

  • 客户端:用来向服务器发送数据,可以被称之为请求报文
  • 服务端:向客户端返回数据,可以被称之为响应报文

二、请求报文的组成

  • 请求行
  • 请求头
  • 空行
  • 请求体

三、响应报文的组成

  • 响应行

    HTTP/1.1 200 ok
    还有一些状态码,参考:https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Status

  • 响应头

    Cache-Control:缓存控制 private 私有的,只允许客户端缓存数据
    Connection 链接设置
    Content-Type:text/html;charset=utf-8 设置响应体的数据类型以及字符集,响应体为html,字符集
    utf-8
    Content-Length:响应体的长度,单位为字节
    
  • 空行

  • 响应体

  • 响应体内容的类型是非常灵活的,常见的类型有 HTML、CSS、JS、图片、JSON

四、创建http服务

使用 nodejs 创建 HTTP 服务

4.1 操作步骤

//1. 导入 http 模块
const http = require('http');
//2. 创建服务对象 create 创建 server 服务
// request 意为请求. 是对请求报文的封装对象, 通过 request 对象可以获得请求报文的数据
// response 意为响应. 是对响应报文的封装对象, 通过 response 对象可以设置响应报文
const server = http.createServer((request, response) => {//解决中文乱码response.setHeader("Content-Type","text/html;charset=utf-8")response.end('Hello HTTP server');
});
//3. 监听端口, 启动服务
server.listen(9000, () => {console.log('服务已经启动, 端口 9000 监听中...');
});

http.createServer 里的回调函数的执行时机: 当接收到 HTTP 请求的时候,就会执行

4.2 注意事项

  1. 命令行 ctrl + c 停止服务

  2. 当服务启动后,更新代码 必须重启服务才能生效

  3. 响应内容中文乱码的解决办法

    response.setHeader('content-type','text/html;charset=utf-8');
    
  4. 端口号被占用

    Error: listen EADDRINUSE: address already in use :::9000
    

    1)关闭当前正在运行监听端口的服务 ( 使用较多 )
    2)修改其他端口号

  5. HTTP 协议默认端口是 80 。HTTPS 协议的默认端口是 443, HTTP 服务开发常用端口有 3000,
    8080,8090,9000

五、获取 HTTP 请求报文

想要获取请求的数据,需要通过 request 对象

含义语法
请求方法request.method
请求版本request.httpVersion
请求路径request.url
URL 路径require(‘url’).parse(request.url).pathname
URL 查询字符串require(‘url’).parse(request.url, true).query
请求头request.headers
请求体request.on(‘data’, function(chunk){})
请求方法request.method request.on(‘end’, function(){});

注意事项:

  1. request.url 只能获取路径以及查询字符串,无法获取 URL 中的域名以及协议的内容
  2. request.headers 将请求信息转化成一个对象,并将属性名都转化成了『小写』
  3. 关于路径:如果访问网站的时候,只填写了 IP 地址或者是域名信息,此时请求的路径为『 / 』
  4. 关于 favicon.ico:这个请求是属于浏览器自动发送的请求

5.1 获取请求报文

//1. 导入http模块
const http = require('http');
//2.创建服务对象 create 创建 server 服务
const server = http.createServer((request,response)=>{//1.获取请求方法console.log(request.method);//2.获取http版本console.log(request.httpVersion);//3.获取请求路径console.log(request.url);//4.获取请求头console.log(request.headers);// 响应内容中文乱码的解决办法response.setHeader('content-type','text/html;charset=utf-8');response.end("你好啊");
})
//3.监听端口,启动服务
server.listen(8080,()=>{console.log("服务已经启动");
})

5.2 提取路径和查询字符串

方法一:引入url模块

//1. 导入http模块
const http = require('http');
//导入url模块
const url = require('url');
//2.创建服务对象 create 创建 server 服务
const server = http.createServer((request,response)=>{//解析request.url// console.log(request.url);let res = url.parse(request.url,true);//路径console.log(res.pathname);//查询字符串console.log(res.query.wd);response.end('url')})
//3.监听端口,启动服务
server.listen(9000,()=>{console.log("服务已经启动");
})

方法二:实例化URL对象

//1. 导入http模块
const http = require('http');
//2.创建服务对象 create 创建 server 服务
const server = http.createServer((request,response)=>{//实例化url对象let url = new URL(request.url,'http://127.0.0.1:9000');//路径console.log(url.pathname);//查询字符串console.log(url.searchParams.get('wd'));response.end('url new ')})
//3.监听端口,启动服务
server.listen(9000,()=>{console.log("服务已经启动");
})

六、设置 HTTP 响应报文

作用语法
设置响应状态码response.statusCode
设置响应状态描述response.statusMessage ( 用的非常少 )
设置响应头信息response.setHeader(‘头名’, ‘头值’)
设置响应体response.write(‘xx’) or response.end(‘xxx’)
write 和 end 的两种使用情况:
//1. write 和 end 的结合使用 响应体相对分散
response.write('xx');
response.write('xx');
response.write('xx');
response.end(); //每一个请求,在处理的时候必须要执行 end 方法的
//2. 单独使用 end 方法 响应体相对集中
response.end('xxx');

示例代码:


//1.导入http模块
const http = require('http');
//2.创建对象
const server = http.createServer((request,response)=>{//设置响应状态码response.statusCode = 203;//响应状态描述response.statusMessage = "hello world"//设置响应头response.setHeader('content-type','text/html;charset=utf-8');response.setHeader('test',['a','b','c']);//设置响应体 ,write可以写多次,end只能出现一次response.write("write写入");response.write("write写入");response.write("write写入");response.end('end写入')})
//3.监听端口,开启服务
server.listen(9000,()=>{console.log("服务已启动")
})

七、MIME设置资源类型

//1.导入http模块
const http = require('http');
//引入fs
const fs = require('fs');
//引入path模块
const path = require('path');
//mime类型数组
let mime = {html: 'text/html',css: 'text/css',js: 'text/javascript',png: 'image/png',jpg: 'image/jpeg',gif: 'image/gif',mp4: 'video/mp4',mp3: 'audio/mpeg',json: 'application/json'
}
//2.创建对象
const server = http.createServer((request,response)=>{let {pathname} = new URL(request.url,'http://127.0.0.1:9000')//拼接路径let filepath = __dirname + pathname;//异步fs读取fs.readFile(filepath,(err,data)=>{if(err){response.end('响应失败');return;}//获取文件后缀let ext = path.extname(filepath).slice(1);//获取mime类型let type = mime[ext];type?response.setHeader("content-type",type+';charset=utf-8'):response.setHeader("content-type","application/octet-stream");response.end(data);})
})
//3.监听端口,开启服务
server.listen(9000,()=>{console.log("服务已启动")
})

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/70969.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

学妹学Java(一)

⭐简单说两句⭐ 作者:后端小知识 CSDN个人主页:后端小知识 🔎GZH:后端小知识 🎉欢迎关注🔎点赞👍收藏⭐️留言📝 Hello,亲爱的各位友友们,好久不见&#xff0…

RabbitMQ: SpringBoot 整合 RabbitMQ

一、生产者模块 1.导入依赖 重点是这个依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></dependency> <properties><maven.compiler.source>8</maven.…

【Vue-Element-Admin】级联查询

背景 有两个查询条件&#xff1a;模块、功能点 想实现选择模块后&#xff0c;点击功能点下拉框&#xff0c;查询出对应模块下的功能点列表 查询 listQuery: export default{return{listQuery:{//page:1,//limit:20,//如果想兼容按条件导出&#xff0c;可以定义查询条件age:…

K8s 多集群实践思考和探索

作者&#xff1a;vivo 互联网容器团队 - Zhang Rong 本文主要讲述了一些对于K8s多集群管理的思考&#xff0c;包括为什么需要多集群、多集群的优势以及现有的一些基于Kubernetes衍生出的多集群管理架构实践。 一、为什么需要多集群 随着K8s和云原生技术的快速发展&#xff0c…

echarts条形图实现颜色渐变

eCharts——柱状图中的柱体颜色渐变_echarts 柱状图渐变_小美同学的博客-CSDN博客 【Echarts】柱状图渐变两种实现方式_echarts柱状图渐变_芳草萋萋鹦鹉洲哦的博客-CSDN博客

将 Spring Boot 应用程序与 Amazon DocumentDB 集成

Amazon DocumentDB&#xff08;与 MongoDB 兼容&#xff09;是一种可扩展、高度持久和完全托管的数据库服务&#xff0c;用于操作任务关键型 MongoDB 工作负载。在 Amazon DocumentDB 上&#xff0c;您可以使用相同的 MongoDB 应用程序代码、驱动程序和工具来运行、管理和扩展工…

学习笔记|回顾(1-12节课)|应用模块化的编程|添加函数头|静态变量static|STC32G单片机视频开发教程(冲哥)|阶段小结:应用模块化的编程(上)

文章目录 1.回顾(1-12节课)2.应用模块化的编程(.c .h)Tips:添加函数头创建程序文件三步引脚定义都在.h文件函数定义三步bdata位寻址变量的使用 3.工程文件编写静态变量static的使用完整程序为&#xff1a;demo.c&#xff1a;seg_led.c:seg_led.h: 1.回顾(1-12节课) 一、认识单…

文件上传漏洞-upload靶场13-16关 (图片木马-文件包含与文件上次漏洞)

文件上传漏洞-upload靶场13-16关 &#xff08;图片木马-文件包含与文件上次漏洞&#xff09; 简介 upload靶场到了第十三关&#xff0c;难度就直线上升了&#xff0c;在最后这7关中&#xff0c;包含了图片木马、竞争条件等上传技巧&#xff0c;这些漏洞的本质&#xff0c;都是…

重复的DNA序列(力扣)JAVA

DNA序列 由一系列核苷酸组成&#xff0c;缩写为 ‘A’, ‘C’, ‘G’ 和 ‘T’.。 例如&#xff0c;“ACGAATTCCG” 是一个 DNA序列 。 在研究 DNA 时&#xff0c;识别 DNA 中的重复序列非常有用。 给定一个表示 DNA序列 的字符串 s &#xff0c;返回所有在 DNA 分子中出现不止…

Vite,Vue3项目引入dataV报错的解决方法

背景:开发一个大屏项目中,需要是要DataV的那边边框,装饰等,只是DataV是基于vue2的,vue3版的作者还在开发中,于是翻了DataV的源码,发现使用esm方式时是直接引入源码而不经过打包,其源码中使用的vue语法vue3也支持,所以可以直接在vue3中引入使用. vite,vue3项目直接引入DataV 安…

Upload-labs 1~15 通关详细教程

文章目录 Upload-labs 1~15 通关详细教程Pass-01-前端js验证Pass-02-后端MIME验证Pass-03-黑名单验证Pass-04-黑名单验证.htaccessPass-05-文件后缀名大小写绕过Pass-06-文件后缀名空格绕过Pass-07-文件后缀名点绕过Pass-08-文件后缀名::$DATA绕过Pass-09-点空格点空格绕过Pass…

《Market Insight:中国低代码/零代码市场发展洞察 ( 2023 )》报告正式发布 | LowCode低码时代

数字化浪潮下&#xff0c;低代码/零代码通过提升“开发生产力”将极大促进技术应用效率和产业数字化进程。目前中国的低代码/零代码在制造业、政务与公共事业、金融、电商等领域取得了一定的应用成效。而伴随着生成式AI技术的应用突破&#xff0c;低代码/零代码市场又将迎来新的…

【前端】React项目初体验

React介绍 React 是一个非常流行的 JavaScript 前端框架&#xff0c;它为开发人员提供了一种快速构建高质量用户界面的方式。以下是使用 React 构建项目的初体验&#xff1a; 安装 React 和相关依赖项 使用 React 开发项目需要先安装一些必需的依赖项&#xff0c;包括 Node.…

快速掌握STM32工程创建

STM32 工程创建-- 使用Keil uVision5 软件 晓理紫 1 准备库函数库 STM32F10x_StdPeriph_Lib_V3.5.0 VX 搜索“晓丽紫”关注回复STM32F10x即可下载 2、创建一个目录用来存放工程 STM32Study STM32Study/study1 存放本次工程目录 3、打开Keil uVision5 创建工程 4、选择型号(根据…

【用unity实现100个游戏之9】使用Unity制作类八方旅人、饥荒风格的俯视角2.5D游戏

前言 2.5D游戏 是一种介于二维和三维之间的游戏形式。它通常在二维平面上展示游戏内容&#xff0c;但利用三维技术来实现更加逼真的图像效果。 在2.5D游戏中&#xff0c;角色和环境通常是以平面的形式呈现&#xff0c;但可以在垂直方向上移动。这意味着玩家可以在一个相对较薄…

对话永洪科技CEO何春涛:专注BI,决胜AI时代丨数据猿专访

大数据产业创新服务媒体 ——聚焦数据 改变商业 大数据、云计算、人工智能为代表的新一代信息技术走向普及&#xff0c;数据驱动业务&#xff0c;逐渐成为现代化企业管理、运作的日常。对于年均复合增长率超过20%的国内商业智能&#xff08;BI&#xff09;市场而言&#xff0c…

编译KArchive在windows10下

使用QT6和VS2019编译KArchive的简要步骤&#xff1a; 安装 Qt &#xff0c;我是用源码自己编译的 "F:\qtbuild"安装CMakefile并配置环境变量安装Git下载ECM源码 https://github.com/KDE/extra-cmake-modules.git-------------------------------------------------…

lintcode 1840 · 矩阵还原【中等 vip 二维前缀和数组】

题目 https://www.lintcode.com/problem/1840 现有一个n行m列的矩阵 before&#xff0c;对于before里的每一个元素 before[i][j]&#xff0c;我们会使用以下算法将其转化为 after[i][j]。现给定after矩阵&#xff0c;请还原出原有的矩阵before。s 0 for i1: 0 -> ifor j1…

运筹系列85:求解大规模tsp问题的julia代码

1. 大规模tsp问题的挑战 数学模型和精确解法见《运筹系列65&#xff1a;TSP问题的精确求解法概述》和《运筹系列80:使用Julia精确求解tsp问题》&#xff1a; variable(m, x[1:n,1:n], Bin,Symmetric) # 0-1约束 objective(model, Min, sum(x.*distmat)/2) constraint(model, …

计算机视觉的应用13-基于SSD模型的城市道路积水识别的应用项目

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下计算机视觉的应用13-基于SSD模型的城市道路积水识别的应用项目。今年第11号台风“海葵”后部云团的影响&#xff0c;福州地区的降雨量突破了历史极值&#xff0c;多出地方存在严重的积水。城市道路积水是造成交通拥…