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

news2025/1/24 21:38:24

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.coloradmin.cn/o/2281635.html

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

相关文章

09_异步加载_单例模式_常量类配置_不可销毁

1.首先在 资源加载服务层ResSvc.cs中添加 自定义异步加载函数 using UnityEngine; using UnityEngine.SceneManagement; //异步加载 命名空间 //功能 : 资源加载服务 public class ResSvc : MonoBehaviour{public void InitSvc(){Debug.Log("Init ResSvc...");}//自定…

概率密度函数(PDF)分布函数(CDF)——直方图累积直方图——直方图规定化的数学基础

对于连续型随机变量&#xff0c;分布函数&#xff08;Cumulative Distribution Function, CDF&#xff09;是概率密度函数&#xff08;Probability Density Function, PDF&#xff09;的变上限积分&#xff0c;概率密度函数是分布函数的导函数。 如果我们有一个连续型随机变量…

AIGC专栏18——EasyAnimateV5.1版本详解 应用Qwen2 VL作为文本编码器,支持轨迹控制与相机镜头控制

AIGC专栏18——EasyAnimateV5.1版本详解 应用Qwen2 VL作为文本编码器&#xff0c;支持轨迹控制与相机镜头控制 学习前言相关地址汇总源码下载地址HF测试链接MS测试链接 测试效果Image to VideoText to Video轨迹控制镜头控制 EasyAnimate详解技术储备Qwen2 VLStable Diffusion …

如何为64位LabVIEW配置正确的驱动程序

在安装 64位 LabVIEW 后&#xff0c;确保驱动程序正确配置是关键。如果您首先安装了 32位 LabVIEW 和相关驱动&#xff0c;然后安装了 64位 LabVIEW&#xff0c;需要确保为 64位 LabVIEW 安装和配置适当的驱动程序&#xff0c;才能正常访问硬件设备。以下是详细步骤&#xff1a…

详解:TCP/IP五层(四层)协议模型

一.五层&#xff08;四层&#xff09;模型 1.概念 TCP/IP协议模型分为五层&#xff1a;物理层、数据链路层、网络层、传输层和应用层。这五层每一层都依赖于其下一层给它提供的网络去实现需求。 1&#xff09;物理层&#xff1a;这是最基本的一层&#xff0c;也是最接近硬件…

头像生成小程序搭建(免费分享)

如下图为小程序页面的基本效果&#xff0c;下面将介绍该小程序的功能 页面template代码如下&#xff1a; <template><view class"avatar-containner"><block v-if"!showCropper"><image class"pageback" src"../../s…

Unity自学之旅05

Unity自学之旅05 Unity学习之旅⑤&#x1f4dd; AI基础与敌人行为&#x1f94a; AI导航理论知识&#xff08;基础&#xff09;开始实践 &#x1f383; 敌人游戏机制追踪玩家攻击玩家子弹碰撞完善游戏失败条件 &#x1f917; 总结归纳 Unity学习之旅⑤ &#x1f4dd; AI基础与敌…

【分布式日志篇】从工具选型到实战部署:全面解析日志采集与管理路径

网罗开发 &#xff08;小红书、快手、视频号同名&#xff09; 大家好&#xff0c;我是 展菲&#xff0c;目前在上市企业从事人工智能项目研发管理工作&#xff0c;平时热衷于分享各种编程领域的软硬技能知识以及前沿技术&#xff0c;包括iOS、前端、Harmony OS、Java、Python等…

电子应用设计方案102:智能家庭AI鱼缸系统设计

智能家庭 AI 鱼缸系统设计 一、引言 智能家庭 AI 鱼缸系统旨在为鱼类提供一个健康、舒适的生活环境&#xff0c;同时为用户提供便捷的管理和观赏体验。 二、系统概述 1. 系统目标 - 自动维持水质稳定&#xff0c;包括水温、酸碱度、硬度和溶氧量等关键指标。 - 智能投食&…

【安当产品应用案例100集】034-安当KSP支持密评中存储数据的机密性和完整性

安当KSP是一套获得国密证书的专业的密钥管理系统。KSP的系统功能扩展图示如下&#xff1a; 我们知道商用密码应用安全性评估中&#xff0c;需要确保存储的数据不被篡改、删除或者破坏&#xff0c;必须采用合适的安全方案来确保存储数据的机密性和完整性。KSP能否满足这个需求呢…

linux系统下的磁盘扩容

背景&#xff1a;之前通过虚拟机装linux时硬盘空间设置的不够用&#xff0c;所以需要再加点容量。 1、首先通过虚拟机来扩展硬盘 注意&#xff1a;需要关闭linux系统&#xff1b;需要删除之前的快照&#xff1b; 我原来为27G&#xff0c;现在增加到了40G&#xff0c;如下图: …

【MySQL】 库的操作

欢迎拜访&#xff1a;雾里看山-CSDN博客 本篇主题&#xff1a;【MySQL】 库的操作 发布时间&#xff1a;2025.1.23 隶属专栏&#xff1a;MySQL 目录 库的创建语法使用 编码规则认识编码集查看数据库默认的编码集和校验集查看数据库支持的编码集和校验集指定编码创建数据库验证不…

fpga学习入门 串口rs232回环

奇偶检验位这里是省略了 做好回环后可以使用上位机做回环测试&#xff0c;top文件写的方式就是将rx&#xff08;fpga端&#xff09;接受到的模块&#xff08;pc端&#xff09;tx发送出去&#xff0c;这两个端口用杜邦线连接&#xff0c;同理模块的rx连接fpga的tx&#xff0c;…

认识Django项目模版文件——Django学习日志(二)

1.默认文件介绍 └── djangoproject1/├── djangoproject1/│ ├── urls.py [URL和函数的对应关系]【常用文件】│ ├── settings.py [项目配置文件]【常用文件】│ ├── _init_.py│ ├── wsgi.py [接受网络请求] 【不要动】│ └──…

微信小程序中常见的 跳转方式 及其特点的表格总结(wx.navigateTo 适合需要返回上一页的场景)

文章目录 详细说明总结wx.navigateTo 的特点为什么 wx.navigateTo 最常用&#xff1f;其他跳转方式的使用频率总结 以下是微信小程序中常见的跳转方式及其特点的表格总结&#xff1a; 跳转方式API 方法特点适用场景wx.navigateTowx.navigateTo({ url: 路径 })保留当前页面&…

postgresql15的启动

PostgreSQL是一个功能非常强大的、源代码开放的客户/服务器关系型数据库管理系统&#xff0c;且因为许可证的灵活&#xff0c;任何人都可以以任何目的免费使用、修改和分发PostgreSQL。现在国产数据库大力发展阶段&#xff0c;学习和熟悉postgresql的功能是非常有必要的&#x…

ChatGPT结合Excel辅助学术数据分析详细步骤分享!

目录 一.Excel在学术论文中的作用✔ 二.Excel的提示词✔ 三. 编写 Excel 命令 四. 编写宏 五. 执行复杂的任务 六. 将 ChatGPT 变成有用的 Excel 助手 一.Excel在学术论文中的作用✔ Excel作为一种广泛使用的电子表格软件&#xff0c;在学术论文中可以发挥多种重要作用&a…

大模型 / 智能体在智能运维领域的应用总结与发展趋势概述

智能体 智能运维 &#xff1f; 回顾大模型的发展 大模型的发展在过去两年间呈现出爆炸式的增长&#xff0c;成为推动人工智能领域快速进步的关键力量。 2023年3月&#xff1a;百度发布了其知识增强的大语言模型产品“文心一言”&#xff0c;这标志着国内AI大模型产业竞争的…

戴尔电脑设置u盘启动_戴尔电脑设置u盘启动多种方法

最近有很多网友问&#xff0c;戴尔台式机怎么设置u盘启动&#xff0c;特别是近两年的戴尔台式机比较复杂&#xff0c;有些网友不知道怎么设置&#xff0c;其实设置u盘启动有两种方法&#xff0c;下面小编教大家戴尔电脑设置u盘启动方法。 戴尔电脑设置u盘启动方法一、戴尔进入b…

【博客之星】年度总结:在云影与墨香中探寻成长的足迹

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、年度回顾 1、创作历程 2、个人成长 3、个人生活与博客事业 二、技术总结 1、赛道选择 2、技术工具 3、实战项目 三、前景与展望 1、云原生未来…