使用nodejs搭建一个简易HTTP服务的实现示例

目录
  • 先搭建一个简单的HTTP服务
  • 根据不同的请求地址返回不同的信息
  • 获取请求参数
  • 实现服务端设置(跨域)cookie和读取客户端发送的cookie

本文只使用nodejs的http模块搭建一个简单的http服务。

主要实现功能:

  • 响应客户端的请求。
  • 处理不同的请求地址并返回信息。
  • 获取客户端传递的请求体参数(json字符串)和查询字符串参数。
  • 服务端设置cookie和读取客户端发送的cookie。

先搭建一个简单的HTTP服务

主要使用http模块的createServer方法和listen方法。
代码如下:

const http = require('http');
// 初始化http服务
const server = http.createServer();

// 启动 HTTP 服务监听连接
server.listen(8000, () => {
    console.log('service run: http://127.0.0.1:8000');
});

// 侦听请求事件
server.on('request', (req, res) => {
    try {
        // 设置响应头允许跨域
	res.setHeader('Access-Control-Allow-Origin', '*');

        res.statusCode = 200;
        res.setHeader('Content-Type', 'text/plain');
        res.end('HTTP服务搭建成功');
    } catch (ex) {
	console.error(ex.message);
	res.statusCode = 500;
	res.end('service error');
    }
});

如上代码所示一个简单的http服务就搭好了,但是现在还只能返回一些简单的信息到客户端,而且也没有根据请求地址和请求参数做不同的处理。 那么接下来我们就先来处理请求地址的问题。

根据不同的请求地址返回不同的信息

每当收到新的请求时,request事件会被调用,传给request事件的回调函数可以接受两个对象:一个request对象,提供了请求的详细信息。一个response对象,用于设置返回给客户端的信息。 我们可以从request对象的url属性中获取请求地址,代码如下:

const http = require('http');
const server = http.createServer();

server.listen(8000, () => {
    console.log('service run: http://127.0.0.1:8000');
});

server.on('request', (req, res) => {
    try {
        res.setHeader('Access-Control-Allow-Origin', '*');
        res.setHeader('Content-Type', 'application/json');

        // 获取请求地址
	const urls = req.url.split('?');
	const requestAddress = urls[0];
       console.log(`请求地址:${ requestAddress }`);

        const callback = {
          '/test': () => {
            res.statusCode = 200;
            res.end(JSON.stringify({text: '通过测试'}));
          },
          '/': () => {
            res.statusCode = 200;
            res.end(JSON.stringify({text: 'hello world'}));
          }
        }

        if (callback[requestAddress] instanceof Function) {
          return callback[requestAddress]()
        }

        res.writeHead(200, '响应成功');
        res.end('成功收到请求');
    } catch (ex) {
	console.error(ex.message);
	res.statusCode = 500;
	res.end('service error');
    }
});

如上代码实现了不同请求地址返回不同信息的功能,但是也还存在一些问题。例如:没有实现获取请求体参数和查询字符串。
那么我们接下来就来添加获取请求参数的代码。

获取请求参数

查询字符串可以从request对象的url属性中获取,请求体参数可以通过侦听request对象的data事件获取。如下所示:

const http = require('http');
const server = http.createServer();

server.listen(8000, () => {
    console.log('service run: http://127.0.0.1:8000');
});

server.on('request', (req, res) => {
    try {
        res.setHeader('Access-Control-Allow-Origin', '*');
        res.setHeader('Content-Type', 'application/json');

	const urls = req.url.split('?');
	const requestAddress = urls[0];
        console.log(`请求地址:${ requestAddress }`);

        const callback = {
          '/test': () => {
            console.log(`查询字符串:${urls[1]}`);

            if (req.method === 'POST') {
            // post请求,获取json格式的请求体参数
              let data = '';

              // req对象是一个流(参考Stream API),可以监听它的data事件来获取数据块。
              req.on('data', (chunk) => {
                // 这里假设收到的数据是字符串,隐式转换:二进制数据 => 字符串
                data += chunk;
              });

              // 在获取数据结束时,调用end事件
              req.on('end', () => {
                data = JSON.parse(data);
                console.log('请求体:', data);
              });
            }

            res.statusCode = 200;
            res.end(JSON.stringify({text: '通过测试'}));
          },
          '/': () => {
            console.log(`查询字符串:${urls[1]}`);

            res.statusCode = 200;
            res.end(JSON.stringify({text: 'hello world'}));
          }
        }

        if (callback[requestAddress] instanceof Function) {
          return callback[requestAddress]()
        }

        res.writeHead(200, '响应成功');
        res.end('成功收到请求');
    } catch (ex) {
	console.error(ex.message);
	res.statusCode = 500;
	res.end('service error');
    }
});

通过以上代码我们就实现了获取请求体里的json格式数据和查询字符串数据参数。

实现服务端设置(跨域)cookie和读取客户端发送的cookie

服务器要允许跨域带凭据的请求,需要设置响应头Access-Control-Allow-Credentials为true,且响应头Access-Control-Allow-Origin的值不能为‘*’,必须为一个具体的域名。
前端要允许跨域发送凭据到服务器,则需要设置XMLHttpRequest对象的withCredentials属性,将其值修改为true即可。

const http = require('http');
const server = http.createServer();

server.listen(8000, () => {
    console.log('service run: http://127.0.0.1:8000');
});

server.on('request', (req, res) => {
    try {
        // 跨域允许携带凭据(cookie之类)
        res.setHeader('Access-Control-Allow-Credentials', 'true');
        // 要允许跨域携带cookie,必须设置为具体的域,不能是‘*'
        res.setHeader('Access-Control-Allow-Origin', 'http://127.0.0.1:5500');
        res.setHeader('Content-Type', 'application/json');

        const requestAddress = req.url.split('?')[0];

        const callback = {
          '/login': () => {
            // 设置cookie
            res.setHeader('Set-Cookie', 'name=wst;age=24;Max-Age=666;');
            res.statusCode = 200;

            // 返回json格式数据到客户端
            res.end(JSON.stringify({text: '登录成功'}));
          },
          '/': () => {
            // 通过req.headers.cookie读取cookie
            console.log(req.headers.cookie)
            res.statusCode = 200;
            res.end(JSON.stringify({text: 'hello world'}));
          }
        }

        if (callback[requestAddress] instanceof Function) {
          return callback[requestAddress]()
        }

        res.writeHead(200, '响应成功');
        res.end('成功收到请求');
    } catch (ex) {
	console.error(ex.message);
	res.statusCode = 500;
	res.end('service error');
    }
});

到此,我们已经实现了一个简单的HTTP服务,更多相关nodejs搭建HTTP服务内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 从零学习node.js之搭建http服务器(二)

    前言 在上篇文章中我们了解了一下不同模块规范之间的联系与区别.本文我们正式开始node的学习,首先我们从搭建一个http服务器,能运行简单的程序开始说起. 一.hello world 最经典的hello world.首先我们创建一个server.js来保存我们的代码: console.log( 'hello world' ); 在终端输入node server.js运行: node server.js 终端就会输出 hello world 的字样.可是我们一个node服务器程序,总是要在浏览器上

  • NodeJS搭建HTTP服务器的实现步骤

    前言 在 NodeJS 中用来创建服务的模块是 http 核心模块,本篇就来介绍关于使用 http 模块搭建 HTTP 服务器和客户端的方法,以及模块的基本 API. HTTP 服务器 1.创建 HTTP 服务器 在 NodeJS 中,创建 HTTP 服务器可以与 net 模块创建 TCP 服务器对比,创建服务器有也两种方式. 方式 1: const http = require("http"); const server = http.createServer(function(re

  • 基于Node.js的http模块搭建HTTP服务器

    目录 http 模块 代码剖析 request 解析 URL 解析 请求体解析 response 设置 发送 http 请求 GET POST 诡异之处 当你第一次接触工程化的项目时,看到项目控制台正在 building,过一会突然跳出一个 URL 地址,你点开它居然是你刚写好的网页,好神奇. 当你接后端同伴的接口时,你把数据带去,接口竟然给你返回 500 错误:你去找后端,后端说这样传不行,你不知道为啥不行,反正按照他说的改完,返回 200 成功了. 有时候你的请求莫名其妙的就跨域了,后端说让

  • nodejs搭建本地http服务器教程

    由于不做php相关的东西,懒得装apache,干脆利用nodejs搭建一个本地的服务器用于测试. nodejs这玩意儿吧,对做前端的介入后端简直就是一把利器.而且目前,nodejs也越来越有商用价值. nodejs其实是非常底层的,从功能上说,它既是apache也是php.像搭建http服务器这种功能,本来是apache已经封装好的,但nodejs需要我们手动来搭建.其实在实际应用中,我们可以使用现成的框架.但这里,我想手动搭建,也加深一下对http服务器的理解. 我们node执行下面这个文件,

  • 利用node.js本地搭建HTTP服务器

    我们的目的比较简单,利用node.js在本地搭建HTTP服务器,实现hello word. 系统环境: win7 64bitIP:127.0.0.1Node.js:v6.10.2Npm:3.10.10Git:2.12.2.2-64-bit 基本安装: 1.Node.js安装包及源码下载地址为:https://nodejs.org/en/download/ Git下载地址为:https://git-scm.com/download/win. 2.按照安装提示操作即可,选择安装路径.npm. 3.环

  • 搭建简单的nodejs http服务器详解

    搭建简单的nodejs服务器 通过一些简单配置我们就可以搭建一台基于nodejs的http服务器 通过switch配置url路由的方法 // 这是一个简单的Node HTTP服务器,能处理当前目录的文件 // 并能实现两种特殊的URL用于测试 // 用HTTP://localhost:8000或http://127.0.0.1:8000连接这个服务器 // 首先加载所有需要用到的模块 var http = require('http'); // 加载http服务api模块 var fs = re

  • 使用nodejs搭建一个简易HTTP服务的实现示例

    目录 先搭建一个简单的HTTP服务 根据不同的请求地址返回不同的信息 获取请求参数 实现服务端设置(跨域)cookie和读取客户端发送的cookie 本文只使用nodejs的http模块搭建一个简单的http服务. 主要实现功能: 响应客户端的请求. 处理不同的请求地址并返回信息. 获取客户端传递的请求体参数(json字符串)和查询字符串参数. 服务端设置cookie和读取客户端发送的cookie. 先搭建一个简单的HTTP服务 主要使用http模块的createServer方法和listen方

  • 使用node-media-server搭建一个简易的流媒体服务器

    记录一下使用node-media-server的一些过程.本文章环境为windows.本文章适合初学者. 使用到的东西:nodeJs.ffmpeg.node-media-server. 这里说一点(如果有错欢迎指出): node-media-server是作为流媒体服务器,你可以把他理解为中转站,用于转换流格式或者对视频流做一些操作以及向外推送流地址. ffmpeg是作为推流工具,将你需要转换的视频或者视频流推流到流媒体服务器中. 拉流的意思是从流媒体服务器上拉去视频流,观看者通过拉取流媒体服务

  • webpack5搭建一个简易的react脚手架项目实践

    目录 项目初始化 安装webpack 搭建脚手架目录结构 开启本地服务 配置css&sass 安装react的相关依赖 项目添加热更新 生产环境打包 总结 项目初始化 首先我们创建一个目录,初始化 npm,得到一个package.json文件. mkdir react-cli cd react-cli npm init -y 安装webpack 安装webpack和相关依赖.webpack-dev-server是开启开发环境的服务,webpack-merge是合并公共配置文件. npm inst

  • spring boot+mybatis搭建一个后端restfull服务的实例详解

    1.创建一个maven项目. 2.在pom.xml中引入依赖包,如下所示: <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="

  • 使用Python的Bottle框架写一个简单的服务接口的示例

    是不是有这么一个场景,对外提供一堆数据或者是要返回给用户一个结果.但是不想把内部的一些数据和逻辑暴露给对方...简单点来说,就是想以服务的方式对外提供一个接口.对于这种有很多处理方式,RPC,搭建一个web服务啥的....但是这些毕竟都太重量级了,操作起来很麻烦.我这里给出的一种非常easy的方式来处理.使用bottle解决问题. 需求: 检查一个zookeeper服务中的某些节点是否存在,如果存在返回OK,不存在则给出不存的节点信息.要求返回的信息是和pyunit的结果信息一致. 实现环境:

  • nodejs搭建本地服务器并访问文件操作示例

    本文实例讲述了nodejs搭建本地服务器并访问文件操作.分享给大家供大家参考,具体如下: 安装node:https://nodejs.org/en/download/ 在本地建立目录:f:/nodetest,在该目录下新建index.html作为我们将要访问的内容.新建server.js作为node开启的入口: $ cd f:/nodetest $ mkdir index.html $ mkdir server.js index.html文件里简单写一点东西: <!DOCTYPE html>

  • 利用node.js如何搭建一个简易的即时响应服务器

    前言 本文默认您已经按照 nodejs 如果没有安装请安装,安装教程可以查看这篇文章,下面废话不多说,下面来看看这篇文章详细的内容介绍吧. 前提需要创建一个 前端项目 1. 创建一个html文件 写入以下内容 需要说明的是  /socket.io/socket.io.js 这个文件 服务器会生成 使用方法在 node_modules\socket.io\lib\socket.js里面 2. 创建一个js文件  (我的文件名字叫sock.js) 这个js文件是需要运行的文件 里面的代码都有注释 3

  • Nginx学习之如何搭建文件防盗链服务的方法示例

    前言 大家都知道现在很多站点下载资料都是要收费的,无论是积分还是金币,想免费只能说很少很少了,那么这些网站是如何做到资源防盗链的呢? 这里推荐一款比较容易上手的神器,Nginx本身提供了secure_link来完成防盗链功能,可以给服务器文件链接添加时间戳和校验码,从而保护服务器文件不被任意下载盗用. 时序图 Nginx配置 如何安装Nginx这里不再赘述,安装的时候记得开启ngx_http_secure_link_module即可. ./configure --with-http_secure

  • 用nodeJS搭建本地文件服务器的几种方法小结

    搭建nodejs服务器步骤: 1.安装nodejs服务,node相当于apache服务器 2.在自己定义的目录下新建服务器文件如 server.js 例如,我在E:\PhpProject\HTML5\websocket下创建了server.js文件 var http = require('http');//引入http模块 //开启服务,监听8888端口 //端口号最好为6000以上 var server = http.createServer(function(req,res){ /* req

  • 利用Go语言搭建WebSocket服务端方法示例

    Go 搭建一个简单 WebSocket 服务端代码例子 test.go, 如下: package main import ( "fmt" "log" "net/http" "golang.org/x/net/websocket" ) func Echo(ws *websocket.Conn) { var err error for { var reply string if err = websocket.Message.Re

随机推荐