Node js 搭建 一个基础的 HTTP 服务案例

文章目录

  • [创建 HTTP 服务](#创建 HTTP 服务)
  • [创建 HTTP 服务注意事项:](#创建 HTTP 服务注意事项:)
  • [获取 HTTP 请求报文参数](#获取 HTTP 请求报文参数)
  • [获取 URL 请求路径以及请求路径查询字符串](#获取 URL 请求路径以及请求路径查询字符串)
  • [获取 URL 请求路径以及请求路径查询字符串(`推荐使用`)](#获取 URL 请求路径以及请求路径查询字符串(推荐使用))
  • 注意事项
  • [设置返回的 HTTP 响应报文](#设置返回的 HTTP 响应报文)
  • [网页中的 URL](#网页中的 URL)
  • [设置资源类型(mime类型 【Content-Type:)](#设置资源类型(mime类型 【Content-Type:))

创建 HTTP 服务

javascript 复制代码
//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('你好,欢迎请求服务');       //返回响应体内容
});


//3.  server.listen 方法 监听端口, 启动服务
server.listen(8080, () => {
    console.log('服务已经启动, 端口 8080 监听中...');
});

创建 HTTP 服务注意事项:

  1. 命令行 ctrl + c 用来停止服务
  2. 当服务启动后,更新代码 必须重启服务才能生效
  3. 响应内容中文乱码的解决办法
javascript 复制代码
response.setHeader('content-type','text/html;charset=utf-8');
  1. 端口号被占用时
    • 关闭当前正在运行监听端口的服务 ( 使用较多 )
    • 修改其他端口号
  2. HTTP 协议默认端口是 80 。HTTPS 协议的默认端口是 443, HTTP 服务开发常用端口有 3000,8080,8090,9000 等

获取 HTTP 请求报文参数

描述 语法
获取请求方法 request.method
获取请求http协议版本 request.httpVersion
设置响应响应头信息 response.setHeader('key键名', '键值')
获取请求路径 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.on('end', function(){});
javascript 复制代码
//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');   //设置响应体解码规则


    // console.log(request.method);   //获取请求方法

    // console.log(request.httpVersion);   //获取HTTP协议版本

    // console.log(request.url);   //获取请求路径 (不包含IP/域名/端口)

    // console.log(request.headers);   //获取请求头报文

    // response.end('你好,欢迎请求服务');       //返回响应体内容



     //获取请求体
    let datablock = "";
    /** @绑定data事件 ***/
    request.on('data', (chunk) => {    
        datablock += chunk.toString()
    })

    /** @绑定end事件 **/
    request.on('end', () => {
        console.log("获取到完整的请求体数据", datablock);
        response.setHeader('content-type', 'text/html;charset=utf-8');   //设置响应体解码规则
        response.end('你好,欢迎请求服务');       //返回响应体内容
    })
});


//3.  server.listen 方法 监听端口, 启动服务
server.listen(8080, () => {
    console.log('服务已经启动, 端口 8080 监听中...');
});

获取 URL 请求路径以及请求路径查询字符串

javascript 复制代码
// 导入 http 模块
const http = require('http');

//导入 url 模块
const url = require('url');


// 创建服务对象 create 创建 server 服务

// request 是一个包裹了请求报文的对象, 通过 request 对象可以获得请求报文的数据
// response 是一个包裹了响应报文的对象, 通过 response 对象可以设置响应报文


const server = http.createServer((request, response) => {
    let res = url.parse(request.url).pathname;   //获取到请求路径
    //第二个参数传为true,可进行对请求路径查询字符串解包成对象键值对
    let queryData = url.parse(request.url, true);
    //{ num: '"你好呀"', name: '"我很好"' },
    console.log(queryData);
    response.setHeader('content-type', 'text/html;charset=utf-8');   //设置响应体解码规则
    response.end('你好,欢迎请求服务');       //返回响应体内容
});

//  server.listen 方法 监听端口, 启动服务
server.listen(8080, () => {
    console.log('服务已经启动, 端口 8080 监听中...');
});

获取 URL 请求路径以及请求路径查询字符串(推荐使用)

new URL

javascript 复制代码
// 导入 http 模块
const http = require('http');
// 创建服务对象 create 创建 server 服务
// request 是一个包裹了请求报文的对象, 通过 request 对象可以获得请求报文的数据
// response 是一个包裹了响应报文的对象, 通过 response 对象可以设置响应报文


const server = http.createServer((request, response) => {
    let url = new URL(request.url, "http://127.0.0.1:8080/");

    /** @获取请求路径 **/
    console.log(url.pathname);
    /*** @获取查询字符串 **/
    console.log(url.searchParams.get("num"));  //传入key

    response.setHeader('content-type', 'text/html;charset=utf-8');   //设置响应体解码规则
    response.end('你好,欢迎请求服务');       //返回响应体内容
});

//  server.listen 方法 监听端口, 启动服务
server.listen(8080, () => {
    console.log('服务已经启动, 端口 8080 监听中...');
});

注意事项

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

设置返回的 HTTP 响应报文

javascript 复制代码
// 导入 http 模块
const http = require('http');
const server = http.createServer((request, response) => {
    response.statusCode = "505";   /*** @设置响应状态码 ***/
    response.statusMessage = 'no-0isok';  /*** @设置响应状态描述 ***/
    response.setHeader('content-type', 'text/html;charset=utf-8');   //设置响应头配置参数
    response.write('你好,欢迎请求服务');   /** @设置响应体 ***/
    response.write('我很好');    /** @设置响应体 ***/
    response.write('天气好');    /** @设置响应体 ***/

    response.end();       //返回响应体内容
});

//  server.listen 方法 监听端口, 启动服务
server.listen(8080, () => {
    console.log('服务已经启动, 端口 8080 监听中...');
});
描述 语法
设置响应状态码 response.statusCode
设置响应状态描述 response.statusMessage ( 用的非常少 )
设置响应响应头信息 response.setHeader('key键名', '键值')
设置响应体 response.write('xx') response.end('xxx')

网页中的 URL

绝对路径

形式 举例 描述
完整绝对路径 https://www.baidu.com/web 直接向目标资源发送请求,容易理解。网站的外链会用到此形式
次完整绝对路径 //www.baidu.com/web 与页面 URL 的协议拼接形成完整 URL 再发送请求。大型网站用的比较多
常用绝对路径 /web 与页面 URL 的协议、主机名、端口拼接形成完整 URL 再发送请求。中小型网站

相对路径

相对路径在发送请求时,需要与当前页面 URL 路径进行 计算 ,得到完整 URL 后,再发送请求,实际项目中使用较少,项目中大多数采用绝对路径


设置资源类型(mime类型 【Content-Type:)

描述

媒体类型(通常称为 Multipurpose Internet Mail Extensions 或 MIME 类型 )是一种标准,用来表示文档、文件或字节流的性质和格式。

HTTP 服务可以设置响应头 Content-Type 来表明响应体的 MIME 类型,浏览器会根据该类型决定如何处理资源

下面是常见文件对应的 mime 类型

资源类型 描述
html text/html
css text/css
js text/javascript
png image/png
jpg image/jpg
gif image/gif
mp4 video/mp4
mp3 audio/mpeg
json application/json

🚵‍♂️ 博主座右铭:向阳而生,我还在路上!


🚴博主想说:将持续性为社区输出自己的资源,同时也见证自己的进步!


🤼‍♂️ 如果都看到这了,博主希望留下你的足迹!【📂收藏!👍点赞!✍️评论!】


相关推荐
子兮曰2 天前
jev-ultrafast 深度解析:7 秒订机票的浏览器 Agent 是如何炼成的
前端·后端·agent
子兮曰2 天前
Jev 爆发一周:7 秒 Agent 背后的 System One 生态与三场争议
前端·后端·ai编程
小羊没烦恼!2 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
前端小万2 天前
写公众号赚了 3000 块后,我做了一款叫 "一键成稿" 的软件
前端·微信小程序
爱勇宝2 天前
ZCode 开源 24 小时:一份没有历史的账本,回答不了"有没有偷代码"
前端·后端·chatglm (智谱)
三十而立洋2 天前
Cookie 详解:从产生到安全,一次讲透
前端·javascript
伞伞悦读3 天前
【第38期】Python 模块与包详解:import、from、模块搜索路径、包结构和 __init__
开发语言·python
卡布鲁3 天前
把一个 Vite + Vue3 应用塞进 qiankun (React + Umi3) 主站:十个坑的复盘
前端·javascript·react.js
C语言小火车3 天前
C/C++ 为什么需要编译器?
开发语言·c++
李少兄3 天前
JavaScript 隐式全局变量解析
javascript