Node.js http 模块详解:request 对象

这篇具有很好参考价值的文章主要介绍了Node.js http 模块详解:request 对象。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

前文介绍了 http 模块的基本用法,主要就是调用 createServerlisten 方法来创建和启动服务。要处理具体的 HTTP 请求,就要在 createServer 方法中写点什么。本文来介绍处理请求的两个核心对象之一的 request

URL

HTTP 协议最早设计出来,仅仅为了获取网络上的某个 HTML 文档。随着后来的发展,网络上的资源越来越丰富,种类也从单一的文本发展到图片,音频,视频等多媒体类型。但是无论是何种资源,它都有在整个互联网世界中的唯一标识,这就是 URL —统一资源定位符(Uniform Resource Locator)

下面是 URL 的组成:

Node.js http 模块详解:request 对象

  1. scheme :就是我们常说的“协议”,在《HTTP 权威指南》中翻译为“方案”。常用的协议有 HTTP,FTP,SMTP 等等。
  2. user:password@:表示访问此资源的用户和密码。对于公开的网络资源并不需要验证。即使需要也不会这么用,很不安全。通常直接省略。
  3. host:port:表示资源所在的主机名和端口号。HTTP 协议的默认端口号是 80,HTTPS 协议的默认端口号是 443,都还可以省略。
  4. path:路径,表示资源在主机中的位置。
  5. query:查询,表示对资源附加的额外要求。
  6. #fragment:片段标识符,表示资源内部的一个锚点,浏览器可以跳转到它指示的位置。但是此部分不会发送到服务器。

request 对象

HTTP 协议是基于请求-响应模型的协议,在 HTTP2 以前,必须是客户端发起请求,服务器接收请求,再将处理的结果响应给客户端。

客户端在向服务器发送 HTTP 请求时,需要指定一个具体的 URL 和 HTTP 方法,告诉服务器我想要写什么,还是提交些什么。通常还会携带一些信息,这些信息可以放在 URL 中,或者放在 HTTP Header(首部)中,如果是向服务器提交数据,还可以放在 HTTP 报文实体中。

那么服务器就要想办法接收这些东西,http 模块中的 request 对象中就包含了这些东西,可以根据自己的需要有选择的解析出来使用。

解析 Method

HTTP 方法常用的有 GetHeadPostPutDelete 等等,可以直接使用 request.method 来获取。

const server = http.createServer((request, response) => {
	const method = request.method;
	console.log(method)
	response.end('Hello, World');
});

浏览器刷新一下页面,服务端打印:

Node.js http 模块详解:request 对象

解析 URL

URL 构成比较复杂,通过 request.url 只能获取完整的 URL。比如浏览器访问 http://localhost:3000/list?page=10

const server = http.createServer((request, response) => {
    console.log(request.method)
	console.log(request.url)

	response.end('Hello, World');
});

控制台打印:

Node.js http 模块详解:request 对象

若要获得某个部分,比如路径 path,查询参数 query,可以借助内置的 url 模块:

const http = require('http');
const url = require('url');

const server = http.createServer((request, response) => {
	
	const urlObj = url.parse(request.url)
	console.log(urlObj)

	response.end('Hello, World');
});

parse 方法,将原始的 URL 解析为一个对象:

Node.js http 模块详解:request 对象

解析 Query

通过上面的方式,可以得到当前请求的资源的路径和查询参数。但是查询参数依然是一个字符串,不方便使用。

可以使用内置的 querystring 模块去解析,或者使用 URLSearchParams API 去解析,或者使用第三方的 qsquerystringify 等模块去解析。以内置模块 querystring 为例:

const http = require('http');
const url = require('url');
const qs = require('querystring');

const server = http.createServer((request, response) => {
	let { query } = url.parse(request.url)

	query = qs.parse(query)
	console.log(query)

	response.end('Hello, World');
});

就可以轻松得到一个 query 对象,方便读取查询参数了:

Node.js http 模块详解:request 对象

解析 Header

HTTP 请求的首部信息都放在了 request.headers 对象中。

const server = http.createServer((request, response) => {

	console.log(request.headers);

	response.end('Hello, World');
});

浏览器发一次请求,服务端会打印:

Node.js http 模块详解:request 对象

如图,像是 sec-ch-uasec-ch-ua-mobile 这种以 sec- 为前缀的请求头,表示的是禁止使用代码修改的 HTTP 消息头,用户代理保留全部对它们的控制权。比如我们熟悉的 User-Agent,通常后端会根据它来判断用户的系统和平台,但是它很容易就被修改进行伪装,因此是不安全的。通过 sec-ch-ua 就能安全的将用户代理信息传给服务器。

除了这些安全的Header,剩下的我们都非常熟悉了:

  • host:此次请求到主机名。用于虚拟主机设置。

  • connection:控制网络连接的断开。HTTP/1.1 默认为 keep-alive,表示长连接

  • cache-control:设置强缓存。

  • accept:客户端可接收的内容的类型。

  • accept-encoding:客户端可用的内容编码方式——通常是某种压缩算法。

若要获取具体某个 Header 的信息,可以使用方括号语法:

const server = http.createServer((request, response) => {

	console.log(request.headers['content-type']);

	response.end('Hello, World');
});

解析请求体

HTTP 报文分为请求报文响应报文。报文由这三部分构成:

  • 起始行:分为请求行,状态行。
  • 首部:描述请求相关的信息,也会描述实体数据的信息。
  • 实体:携带的数据。

Node.js http 模块详解:request 对象

有的请求,比如文件上传,表单提交,要携带一些数据,这些数据就是放在报文的实体中传输的

HTTP 请求只管发送数据,而不管数据是何类型。所以会在请求头中通过 Content-Type 来告知服务器,此次请求所携带的数据是什么格式的。request 对象将接收到的实体中的数据,都放在 requst.body 中。根据这两点,就可以解析出客户端所传的数据。

另外,request 对象是一个可读流,通过监听 data 事件,就能读取出来实体中所传输的数据。当监听到 end 事件,表示实体中数据读取完毕,就可以进行解析了。

const http = require('http');
const url = require('url');

const server = http.createServer((request, response) => {
	const method = request.method;
	const { pathname } = url.parse(request.url);

    // 处理 Post /user/login
    if(method === 'POST' && pathname === '/user/login') {

        let arr = [];
        const contentType = request.headers['content-type']
        if (contentType === 'application/json') {
            // 监听 data 事件,读取实体数据
            request.on('data', (data) => {
                console.log(data)
                arr.push(data)
            })

            // 监听 end 事件,处理数据
            request.on('end', () => {
                console.log('传输完毕')
                let json = JSON.parse(Buffer.concat(arr).toString())
                console.log(json)
            })
            // 结束响应
            response.end('Hello, World');
        }
    }
});

server.listen(3000, () => {
	console.log('服务器启动成功:http://localhost:3000')
})

以一个用户登录的表单提交为例,通常会使用 json 格式传递数据。打开 Postman 或者 ApiPost 来发送请求:

Node.js http 模块详解:request 对象

服务端程序打印结果如下:

Node.js http 模块详解:request 对象

总结

本文介绍了通过 request 对象几个常用到的属性来处理 HTTP 请求:

  • request.method:获取请求方法
  • request.url:获取请求 URL,还需要再借助 urlquerystring 等工具进一步解析
  • request.headers:获取请求头信息
  • request.body:获取请求体数据,需要根据 Content-Type 解析为不同的格式

下篇文章会介绍 reponse 对象,来完成完成的一次请求处理。文章来源地址https://www.toymoban.com/news/detail-474147.html

到了这里,关于Node.js http 模块详解:request 对象的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Node.js学习 day3——http模块】

    命令行 ctrl + c 停止服务 当服务启动后,更新代码必须 重启服务才能生效 响应内容中文乱码的解决办法 端口号被占用 关闭当前正在运行监听端口的服务(使用较多) 修改其他端口号 HTTP协议默认端口是80。HTTP服务开发常用端口有3000,8080,8090,9000等。 想要获取请求的数据,需

    2024年02月02日
    浏览(41)
  • Node.js-fs、path、http模块

    Node.js 作为一个JavaScript 的运行环境,仅仅提供了基础的功能和 AP1。然而,基于 ode.s 提供的这些基础能,很多强大的工具和框架如雨后春笋,层出不穷,所以学会了 Nodejs,可以让前端程序员胜任更多的工作和岗位: 基于Express 框架(http://www.expressjs.com.cn/),可以快速构建 Web 应用

    2024年02月04日
    浏览(43)
  • node-red中http request节点各种复杂格式请求详解

    在node-red中,如果你想要请求外部资源,比如获取当地天气,这个时候就可以使用http request节点,这个节点可以让你的node-red应用集成各种接口,数据。不受跨域的限制,可以访问大部分的http接口。支持的请求方法也比较全,GET,PUT,POST,PATCH或DELETE都是可以的。并且支持自定义

    2024年02月04日
    浏览(36)
  • 【佳学基因检测】Node.js中http模块的使用

    先看代码: 该代码片段是使用Node.js的http模块创建一个简单的HTTP服务器。我们可以逐句来解释它的功能: http.createServer(function (req, res) { … }: http是Node.js中的核心模块,用于处理HTTP操作。此处的createServer是http模块中的一个方法,它用于创建一个新的HTTP服务器。 function (req,

    2024年02月05日
    浏览(35)
  • Node.js - fs模块、path模块、http模块、Node.js模块化(ECMAScript标准的导出和导入)、包、npm包的管理和安装依赖、nodemon

    什么是 Node.js,有什么用,为何能独立执行 JS 代码,演示安装和执行 JS 文件内代码? Node.js 是一个独立的 JavaScript 运行环境,能独立执行 JS 代码,因为这个特点,它可以用来 编写服务器后端的应用程序 在** 传统Web开发中,浏览器就是JavaScript的运行时环境 **, 因为它提供了

    2024年02月02日
    浏览(43)
  • Node.js 学习笔记 fs、path、http模块;模块化;包;npm

    教学视频 BV1MN411y7pw , P83-97的笔记 Node.js是一个跨平台JavaScript运行环境,使开发者可以搭建服务器端的JavaScript应用程序。 作用:使用 Node.js 编写服务器端程序 ✓ 编写数据接口,提供网页资源浏览功能等等 ✓ 前端工程化:为后续学习 Vue 和 React 等框架做铺垫 1.前端工程化 前

    2024年04月08日
    浏览(75)
  • node.js内置模块fs,path,http使用方法

    NodeJs中分为两部分 一是V8引擎为了解析和执行JS代码。 二是内置API,让JS能调用这些API完成一些后端操作。 内置API模块(fs、path、http等) 第三方API模块(express、mysql等) fs模块 fs.readFile()方法,用于读取指定文件中的内容。 fs.writeFile()方法,用于向执行的文件中写入内容 path路径处

    2024年02月12日
    浏览(42)
  • Node.js-http模块服务端请求与响应操作,请求报文与响应报文

    简单案例创建HTTP服务端: 端口号被占用: 1.关闭当前正在运行监听端口的服务 2.修改其他的端口号 获取请求方式类型 获取请求的 url 地址 通过实例化 URl 对象获取路径与查询字符串 获取 http 协议的版本号 获取 http 的请求头 响应报文组成: 1.响应行 :包含:HTTP 版本号、响

    2024年02月14日
    浏览(31)
  • java:详解http模块response对象

    上一篇 我们详细解释了 java 中 http模块request对象,这次我们来看看 response 对象,也就是服务器要回复客户端的对象 请求消息:客户端发送给服务器端的数据 数据格式: 请求行 请求头 请求空行 请求体 响应消息:服务器端发送给客户端的数据 数据格式: 响应行 组成:协议

    2024年02月09日
    浏览(25)
  • python 模块requests 发送 HTTP 请求

    一、简介 requests 模块是 python 基于 urllib,采用 Apache2 Licensed 开源协议的 HTTP 库。它比 urllib 更加方便,可以节约我们大量的工作 二、安装 三、方法 requsts.requst(method, url,headers,cookies,proxies,timeout) method:请求方式;字符串类型 url:请求的地址;字符串类型 params:查询参数,g

    2024年02月11日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包