Node.js HTTP模块详解:创建服务器、响应请求与客户端请求

Node.js HTTP模块详解:创建服务器、响应请求与客户端请求

Node.js 的 http 模块是 Node.js 核心模块之一,它允许你创建 HTTP 服务器和客户端。以下是一些关键知识点和代码示例:

1. 创建 HTTP 服务器

使用 http.createServer() 方法可以创建一个新的 HTTP 服务器实例。这个方法接受一个回调函数,该函数在服务器接收到请求时被调用,参数为 req(请求对象)和 res(响应对象)。

const http = require('http');const server = http.createServer((req, res) => {res.writeHead(200, {'Content-Type': 'text/plain'});res.end('Hello World
');
});server.listen(3000, () => {console.log(`服务器运行在 http://localhost:3000/`);
});
2. 响应方法

Node.js 的 http 模块提供了多种方法来响应 HTTP 请求。以下是 http.ServerResponse 对象的一些常用方法及其作用:

  1. writeHead(statusCode, [reasonPhrase], [headers]):

    • 作用:发送一个 HTTP 响应头到客户端。statusCode 是状态码,reasonPhrase 是可选的状态短语(例如:“OK”),headers 是一个包含头部字段的对象。

    • 示例

      res.writeHead(200, { 'Content-Type': 'text/plain' });
      
  2. write(chunk, [encoding]):

    • 作用:发送一个 HTTP 响应体的片段。chunk 是要发送的数据块,encoding 是数据的编码,默认为 'utf8'

    • 示例

      res.write('Hello, ');
      res.write('World!', 'utf8');
      
  3. end([data], [encoding]):

    • 作用:发送 HTTP 响应体的最后一个片段,并关闭连接。如果提供了 data,则会先发送这个数据。

    • 示例

      res.end('This is the end of the response.');
      
  4. setHeader(name, value):

    • 作用:设置响应头字段 name 的值为 value

    • 示例

      res.setHeader('Content-Type', 'application/json');
      
  5. getHeader(name):

    • 作用:返回响应头字段 name 的值。

    • 示例

      const contentType = res.getHeader('Content-Type');
      
  6. removeHeader(name):

    • 作用:移除响应头字段 name

    • 示例

      res.removeHeader('Content-Type');
      
  7. addTrailers(headers):

    • 作用:添加 HTTP 尾部字段,这些字段在响应体之后发送。

    • 示例

      res.addTrailers({ 'Content-MD5': '7895bf4e1c23b21b' });
      
  8. flush():

    • 作用:刷新响应体缓冲区,发送任何缓冲的数据到客户端。

    • 示例

      res.flush();
      
  9. finish():

    • 作用:结束响应。如果响应体已经发送完毕,这个方法没有效果。如果响应体还在发送中,这个方法会发送剩余的数据。

    • 示例

      res.finish();
      
  10. setTimeout(msecs, callback):

*   **作用**:设置响应的超时时间。如果响应在 `msecs` 毫秒内没有结束,那么响应将被自动结束。
*   **示例**:res.setTimeout(3000, () => {console.log('Response timed out');});
  1. destroy(error):
*   **作用**:销毁流,这将发送一个 RST 包到 TCP 层,立即关闭连接。
*   **示例**:res.destroy(new Error('Something went wrong'));

这些方法提供了控制 HTTP 响应的灵活性,允许开发者根据需要发送不同类型的响应。在实际应用中,你可能会根据业务逻辑和客户端的需求来选择使用这些方法。

3. 请求方法

在Node.js中,http模块提供了request方法来发送客户端请求到服务器。以下是http.request方法的一些常用方式:

  1. 基本请求

    const http = require(‘http’);

    const options = {
    hostname: ‘www.example.com’,
    port: 80,
    path: ‘/path’,
    method: ‘GET’
    };

    const req = http.request(options, (res) => {
    console.log(状态码: ${res.statusCode});

    res.on(‘data’, (chunk) => {
    console.log(收到数据块: ${chunk});
    });

    res.on(‘end’, () => {
    console.log(‘响应结束’);
    });
    });

    req.on(‘error’, (e) => {
    console.error(请求遇到问题: ${e.message});
    });

    // 结束请求
    req.end();

  2. 发送POST请求

    const http = require(‘http’);
    const querystring = require(‘querystring’);

    const postData = querystring.stringify({
    key1: ‘value1’,
    key2: ‘value2’
    });

    const options = {
    hostname: ‘www.example.com’,
    port: 80,
    path: ‘/path’,
    method: ‘POST’,
    headers: {
    ‘Content-Type’: ‘application/x-www-form-urlencoded’,
    ‘Content-Length’: Buffer.byteLength(postData)
    }
    };

    const req = http.request(options, (res) => {
    // 处理响应
    });

    req.on(‘error’, (e) => {
    // 处理请求错误
    });

    req.write(postData);
    req.end();

  3. 发送JSON数据

    const http = require(‘http’);
    const JSON.stringify;

    const data = {
    key1: ‘value1’,
    key2: ‘value2’
    };

    const options = {
    hostname: ‘www.example.com’,
    port: 80,
    path: ‘/path’,
    method: ‘POST’,
    headers: {
    ‘Content-Type’: ‘application/json’,
    ‘Content-Length’: Buffer.byteLength(JSON.stringify(data))
    }
    };

    const req = http.request(options, (res) => {
    // 处理响应
    });

    req.on(‘error’, (e) => {
    // 处理请求错误
    });

    req.write(JSON.stringify(data));
    req.end();

  4. 使用GET参数

    const http = require(‘http’);
    const querystring = require(‘querystring’);

    const params = {
    key1: ‘value1’,
    key2: ‘value2’
    };

    const options = {
    hostname: ‘www.example.com’,
    port: 80,
    path: /path?${querystring.stringify(params)},
    method: ‘GET’
    };

    const req = http.request(options, (res) => {
    // 处理响应
    });

    req.on(‘error’, (e) => {
    // 处理请求错误
    });

    req.end();

  5. 处理重定向

    const http = require(‘http’);

    let redirectCount = 0;

    const options = {
    hostname: ‘www.example.com’,
    port: 80,
    path: ‘/path’,
    method: ‘GET’
    };

    const req = http.request(options, (res) => {
    if (res.statusCode === 301 || res.statusCode === 302) {
    if (redirectCount < 10) {
    redirectCount++;
    const location = res.headers.location;
    options.path = location;
    const newReq = http.request(options, (res) => {
    // 处理响应
    });
    newReq.end();
    } else {
    console.log(‘Too many redirects’);
    }
    } else {
    // 处理响应
    }
    });

    req.on(‘error’, (e) => {
    // 处理请求错误
    });

    req.end();

这些示例展示了如何使用Node.js的http模块发送不同类型的HTTP请求,包括基本的GET请求、POST请求、发送JSON数据、处理GET参数和自动处理重定向。

4. 处理 POST 请求

对于 POST 请求,你可以监听请求对象的 dataend 事件来处理请求体中的数据。

const http = require('http');
const server = http.createServer((req, res) => {if (req.method === 'POST' && req.url === '/submit') {let body = '';req.on('data', chunk => {body += chunk.toString();});req.on('end', () => {res.writeHead(200, { 'Content-Type': 'text/plain' });res.end(`Received data: ${body}`);});} else {res.writeHead(404, { 'Content-Type': 'text/plain' });res.end('404 Not Found');}
});
server.listen(3000, () => {console.log('Server running at http://localhost:3000/');
});
5. Http状态码

在Node.js的http模块中,设置响应头和状态码是通过http.ServerResponse对象的方法writeHead来完成的。以下是如何设置响应头和状态码的示例:

const http = require('http');const server = http.createServer((req, res) => {// 设置状态码为200(OK),并设置响应头res.writeHead(200, {'Content-Type': 'text/plain', // mime类型'Custom-Header': 'Custom Value'});// 发送响应体res.end('Hello, World!');
});server.listen(3000, () => {console.log('Server running at http://localhost:3000/');
});

状态码的类型

HTTP状态码分为几种类型,每种类型表示不同的响应类别:

  1. 1xx(信息性状态码):表示接收到的请求正在处理中。

    • 100 Continue:表明客户端可以继续发送请求体。
    • 101 Switching Protocols:服务器根据客户端的请求切换到了不同的协议。
  2. 2xx(成功状态码):表示请求已成功被服务器接收、理解、并接受。

    • 200 OK:请求成功。
    • 201 Created:请求成功,并且服务器创建了新的资源。
    • 202 Accepted:请求已被接受,但未被执行。
  3. 3xx(重定向状态码):表示需要进一步操作才能完成请求。

    • 301 Moved Permanently:请求的资源已被永久移动到新位置。
    • 302 Found:请求的资源临时移动到另一个URI。
    • 304 Not Modified:如果请求的资源未修改,可以返回此状态码,无需再次发送资源内容。
  4. 4xx(客户端错误状态码):表示请求包含错误或无法被服务器理解。

    • 400 Bad Request:服务器无法理解请求,请求无效或格式错误。
    • 401 Unauthorized:请求需要用户的身份认证。
    • 403 Forbidden:服务器理解请求,但是拒绝执行。
    • 404 Not Found:服务器找不到请求的资源。
  5. 5xx(服务器错误状态码):表示服务器在处理请求的过程中发生了错误。

    • 500 Internal Server Error:服务器遇到了一个预料之外的情况,导致无法完成请求。
    • 501 Not Implemented:服务器不支持请求的功能,无法完成请求。
    • 503 Service Unavailable:服务器目前无法处理请求,可能是过载或停机维护。

状态码是HTTP协议的核心部分,它们为客户端提供了请求处理结果的标准化信息。正确使用状态码可以帮助客户端更好地理解服务器响应的含义,并据此进行适当的操作。

6. MIME类型

MIME(Multipurpose Internet Mail Extensions,多用途互联网邮件扩展)类型,也称为媒体类型,是一种标准,用于定义文件的格式和类型。在HTTP协议中,MIME类型用于告诉浏览器或接收端如何处理传输的数据。每个MIME类型由两部分组成:类型和子类型,中间用斜杠(/)分隔。

以下是一些常见的MIME类型及其描述:

  1. Text-based MIME types:

    • text/html:HTML文档。
    • text/css:层叠样式表(CSS)。
    • text/javascript:JavaScript代码。
    • text/plain:纯文本文件。
    • text/xml:XML文档。
  2. Image MIME types:

    • image/gif:GIF图片。
    • image/jpeg:JPEG图片。
    • image/png:PNG图片。
    • image/svg+xml:SVG矢量图。
  3. Audio MIME types:

    • audio/mpeg:MP3音频文件。
    • audio/wav:WAV音频文件。
    • audio/ogg:OGG音频文件。
  4. Video MIME types:

    • video/mpeg:MPEG视频文件。
    • video/mp4:MP4视频文件。
    • video/ogg:OGG视频文件。
  5. Application MIME types:

    • application/json:JSON数据。
    • application/xml:XML数据。
    • application/pdf:PDF文档。
    • application/zip:ZIP压缩文件。
    • application/javascript:JavaScript代码(通常用于外链脚本)。
  6. Font MIME types:

    • font/ttf:TrueType字体。
    • font/otf:OpenType字体。
    • font/woff:Web Open Font Format。
    • font/woff2:Web Open Font Format 2.0。
  7. Other MIME types:

    • multipart/form-data:用于表单数据的编码类型。
    • binary/octet-stream:任意的二进制数据。
    • application/octet-stream:用于二进制文件,如可执行文件或字节流。

MIME类型在HTTP响应的Content-Type头字段中指定,告诉浏览器如何处理接收到的数据。同样,在发送HTTP请求时,Accept请求头字段可以包含客户端能够处理的MIME类型列表,这允许服务器根据客户端的能力返回合适的数据格式。

7. 处理 JSON 数据

Node.js 的 http 模块可以处理 JSON 格式的数据,以下代码展示了如何返回 JSON 响应:

const http = require('http');
const server = http.createServer((req, res) => {const jsonResponse = {message: 'Hello, World!',status: 'success',};res.writeHead(200, { 'Content-Type': 'application/json' });res.end(JSON.stringify(jsonResponse));
});
server.listen(3000, () => {console.log('Server running at http://localhost:3000/');
});

这些是 Node.js http 模块的一些基本知识点和代码示例,可以帮助你开始使用 Node.js 进行 HTTP 通信。

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

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

相关文章

华为支付接入规范

为了确保用户获得良好的支付体验&#xff0c;Payment Kit制定了相关接入设计规范&#xff0c;请开发者遵照执行&#xff0c;具体要求&#xff08;非强制性&#xff09;如下&#xff1a; 一、支付方式呈现 涉及支付公司名称&#xff0c;请统一使用&#xff1a;花瓣支付&#xff…

C语言-----扫雷游戏

扫雷游戏的功能说明 &#xff1a; • 使⽤控制台实现经典的扫雷游戏 • 游戏可以通过菜单实现继续玩或者退出游戏 • 扫雷的棋盘是9*9的格⼦ • 默认随机布置10个雷 • 可以排查雷&#xff1a; ◦ 如果位置不是雷&#xff0c;就显⽰周围有⼏个雷 ◦ 如果位置是雷&#xff0c;就…

Python人脸识别库DeepFace使用教程及源码解析

目录 一、DeepFace介绍 1、人脸库设计 2、DeepFace.find 3、DeepFace.verify 4、DeepFace.analyze 5、DeepFace.extract_faces 6、DeepFace.represent 7、DeepFace.stream 二、DeepFace二次开发 1、开发活体检测API 2、模型权重持久化 三、总结 一、DeepFace介绍 …

Java多线程的面试面试题及答案解析

什么是进程&#xff1f;什么是线程&#xff1f;有什么区别&#xff1f; 进程是系统资源分配的基本单位&#xff0c;拥有独立的地址空间。线程是 CPU 调度和分派的基本单位&#xff0c;是比进程更小的独立执行的单位&#xff0c;共享所在进程的内存空间等资源。一个进程可以包含…

三分钟简单了解一些HTML的标签和语法_02

1.a标签演示 点击然后跳转 代码加入title 2.图片链接 3.锚点链接 点击就会跳转的当前位置 4.a标签小知识补充 该实例会跳转到顶,锚点链接则会跳转到相应的锚点 5. 结果:直接跳转到该页面的锚点处 6. 在 HTML 中&#xff0c;<tr>标签表示表格中的行&#xff08;TableRow&…

多选multiple下拉框el-select回显问题(只显示后端返回id)

首先保证v-model的值对应options数据源里面的id <el-form-item prop"subclass" label"分类" ><el-select v-model"formData.subclass" multiple placeholder"请选择" clearable :disabled"!!formData.id"><e…

2025年数学建模美赛:A题分析(1)Testing Time: The Constant Wear On Stairs

2025年数学建模美赛 A题分析&#xff08;1&#xff09;Testing Time: The Constant Wear On Stairs 2025年数学建模美赛 A题分析&#xff08;2&#xff09;楼梯磨损分析模型 2025年数学建模美赛 A题分析&#xff08;3&#xff09;楼梯使用方向偏好模型 2025年数学建模美赛 A题分…

Qt——引用第三方SDK lib库的使用方法

【系列专栏】:博主结合工作实践输出的,解决实际问题的专栏,朋友们看过来! 《项目案例分享》 《极客DIY开源分享》 《嵌入式通用开发实战》 《C++语言开发基础总结》 《从0到1学习嵌入式Linux开发》 《QT开发实战》 《Android开发实战》 《实用硬件方案设计》 《结构建模设…

Java 反射与动态代理:实践中的应用与陷阱

Java 反射与动态代理&#xff1a;实践中的应用与陷阱 在现代Java应用中&#xff0c;反射和动态代理提供了强大的灵活性&#xff0c;但它们也带来了性能和复杂度上的挑战。本文将深入探讨这些技术在实际项目中的应用&#xff0c;分析它们可能导致的陷阱&#xff0c;并提供详细的…

Linux(Centos 7.6)命令详解:wc

1.命令作用 打印文件的行数、单词数、字节数&#xff0c;如果指定了多个文件&#xff0c;还会打印以上三种数据的总和(Print newline, word, and byte counts for each FILE, and a total line if more than one FILE is specified) 2.命令语法 Usage: wc [OPTION]... [FIL…

skynet 源码阅读 -- 核心概念服务 skynet_context

本文从 Skynet 源码层面深入解读 服务&#xff08;Service&#xff09; 的创建流程。从最基础的概念出发&#xff0c;逐步深入 skynet_context_new 函数、相关数据结构&#xff08;skynet_context, skynet_module, message_queue 等&#xff09;&#xff0c;并通过流程图、结构…

超分辨率体积重建实现术前前列腺MRI和大病理切片组织病理学图像的3D配准

摘要: 磁共振成像(MRI)在前列腺癌诊断和治疗中的应用正在迅速增加。然而,在MRI上识别癌症的存在和范围仍然具有挑战性,导致即使是专家放射科医生在检测结果上也存在高度变异性。提高MRI上的癌症检测能力对于减少这种变异性并最大化MRI的临床效用至关重要。迄今为止,这种改…

TypeScript 基础使用和相关问题

tsconfig.json 配置文件 {"compilerOptions": {"target": "esnext","jsx": "preserve","jsxImportSource": "vue","lib": ["esnext", "dom"],"useDefineForClassF…

leetcode-分割等和子集

本题涉及到的是01背包问题&#xff0c;我将从两种解决背包问题的思路写出题解 给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集&#xff0c;使得两个子集的元素和相等。 示例 1&#xff1a; 输入&#xff1a;nums [1,5,11,5] 输出&#…

企业级流程架构设计思路-基于价值链的流程架构

获取更多企业流程资料 纸上得来终觉浅&#xff0c;绝知此事要躬行 一.企业流程分级规则定义 1.流程分类分级的总体原则 2.完整的流程体系需要体现出流程的分类分级 03.通用的流程分级方法 04.流程分级的标准 二.企业流程架构设计原则 1.流程架构设计原则 流程框架是流程体…

利用 SoybeanAdmin 实现前后端分离的企业级管理系统

引言 随着前后端分离架构的普及&#xff0c;越来越多的企业级应用开始采用这种方式来开发。前后端分离不仅提升了开发效率&#xff0c;还让前端和后端开发可以并行进行&#xff0c;减少了相互之间的耦合度。SoybeanAdmin 是一款基于 Spring Boot 和 MyBatis-Plus 的后台管理系…

智能风控 数据分析 groupby、apply、reset_index组合拳

目录 groupby——分组 本例 apply——对每个分组应用一个函数 等价用法 reset_index——重置索引 使用前​编辑 注意事项 groupby必须配合聚合函数、 关于agglist 一些groupby试验 1. groupby对象之后。sum&#xff08;一个列名&#xff09; 2. groupby对象…

尚硅谷大数据数仓项目superset db upgrade报错解决(2025.1.23解决)

尚硅谷大数据数仓项目superset db upgrade报错解决&#xff08;2025.1.23解决&#xff09;和 superset安装MySQL报错解决 解决方法&#xff08;2025.1.23解决&#xff09; 0.卸载之前安装好的Superset -- 退出当前环境 conda deactivate-- 卸载Superset conda remove -n sup…

linux-mysql在centos7安装和基础配置

1.安装mysql数据库 1.使用官网安装 1.检查是否存在mysql的分支mariadb [rootlocalhost ~]# rpm -qa |grep mariadb mariadb-libs-5.5.64-1.el7.x86_64 [rootlocalhost ~]# 2.卸载这个分支包 [rootlocalhost ~]# rpm -qa | grep mariadb mariadb-libs-5.5.64-1.el7.x86_64 …

YOLOv5训练自己的数据及rknn部署

YOLOv5训练自己的数据及rknn部署 一、下载源码二、准备自己的数据集2.1 标注图像2.2 数据集结构 三、配置YOLOv5训练3.1 修改配置文件3.2 模型选择 四、训练五、测试六、部署6.1 pt转onnx6.2 onnx转rknn 七、常见错误7.1 训练过程中的错误7.1.1 cuda: out of memory7.1.2 train…