当前位置: 首页 > news >正文

http服务器_http服务器

http 服务器

安装ts-node-dev

npm install ts-node-dev -g

项目准备

在项目目录中输入以下命令

yarn init -y
yarn add --dev @types/node

http初体验

import * as http from 'http';

const server = http.createServer();

server.on('request',(request,response)=>{
  console.log('有人请求了');
  response.end('hi')
})

server.listen(8888)
9501948a1abf2d6b3cec8a0dec3589d0.png
ab4c9503639d7ba46ae2154308fd547a.png

request

  1. 从文档中我们可以知道 request是InComingMessage的实例

  2. request拥有以下属性

  • header
  • url
  • httpVersion
  • ······

从stream.Readablel类中继承了以下事件

  • data
  • end
  • error
  • ······
import * as http from 'http';
import {IncomingMessage, ServerResponse} from 'http';

const server = http.createServer();

server.on('request', (request:IncomingMessage, response:ServerResponse) => {
  console.log(request.method);
  console.log(request.url);
  console.log(request.headers);
  response.end('hi')
});

server.listen(8888);

发送一个get请求

$ curl http://localhost:8888/yyy
af50128f8cc551aa06c0b241a71f5884.png
6b2f41fa7c8d30bcab70a7f736459267.png

发送post请求

$ curl -v -d name="great" http://localhost:8888
f05d65874d9e89b6829f9e921b26a76e.png
fc4d3103dd4b24b0c3ba5bc1da28c79a.png

但是没有看到post上去的数据 那么如何获取到这些数据?

import * as http from 'http';
import {IncomingMessage, ServerResponse} from 'http';

const server = http.createServer();

server.on('request', (request: IncomingMessage, response: ServerResponse) => {
  console.log(request.method);
  const array = [];
  request.on('data', (chunk) => {
    array.push(chunk);
  });
  request.on('end', () => {
    const data = Buffer.concat(array).toString();
    console.log(data);
    response.end('hi');
  });
});

server.listen(8888);
9c986745f177c39dd864593c15a8a0e4.png
bd33fe43e2ff68c86a0f3ecbf031d0b1.png

response

  1. 从文档中我们可以知道 request是ServerResponse的实例

  2. response拥有以下方法

  • getHeader
  • setHeader
  • end
  • write
  • ······

response拥有以下属性

  • statusCode
  • ······
import * as http from 'http';
import {IncomingMessage, ServerResponse} from 'http';

const server = http.createServer();

server.on('request', (request: IncomingMessage, response: ServerResponse) => {
  response.statusCode = 404;
  response.setHeader('GG',`I am 123`)
  response.write('1\n')
  response.write('2\n')
  response.write('3\n')
  response.end()
});

server.listen(8888);
74f8f5a4e3ddf302820092822b5a54ce.png
1f3226560d60aed3bc4afb8a9401c3b1.png

根据不同的url返回不同的文件

import * as http from 'http';
import {IncomingMessage, ServerResponse} from 'http';
import * as fs from 'fs';
import * as p from 'path';


const server = http.createServer();
const publicDir = p.resolve(__dirname,'public')
server.on('request', (request: IncomingMessage, response: ServerResponse) => {
  const {url, method, headers} = request;
  switch (url) {
    case '/index.html':
      response.setHeader('content-Type','text/html;charset=utf-8')
      fs.readFile(p.resolve(publicDir,'index.html'),(error,data)=>{
        if(error) throw error
        response.end(data.toString())
      });
      break;
    case '/style.css':
      response.setHeader('content-Type','text/css;charset=utf-8')
      fs.readFile(p.resolve(publicDir,'style.css'),(error,data)=>{
        if(error) throw error
        response.end(data.toString())
      });
      break;
    case '/main.js':
      response.setHeader('content-Type','text/javascript;charset=utf-8')
      fs.readFile(p.resolve(publicDir,'main.js'),(error,data)=>{
        if(error) throw error
        response.end(data.toString())
      });
      break;
  }
});

server.listen(8888);
317bc40b8058e4aa6a2341b8d8382516.png
c1af91b0751ec74b118bc05d9cd00954.png
502f163440bb438d7ef3e32a29d9fab4.png

处理查询参数

0c09ed7c6b3ff5a11c887175c254ffef.png
a0b2909dd3c6759aa84d77c14adb4aa1.png

查询参数也成为了路径 如何解决这个问题?

import * as http from 'http';
import {IncomingMessage, ServerResponse} from 'http';
import * as fs from 'fs';
import * as p from 'path';
import * as url from 'url';


const server = http.createServer();
const publicDir = p.resolve(__dirname, 'public');
server.on('request', (request: IncomingMessage, response: ServerResponse) => {
  const {url:path, method, headers} = request;
  const object = url.parse(path)
  console.log(object)
  switch (path) {
    case '/index.html':
      response.setHeader('content-Type', 'text/html;charset=utf-8');
      fs.readFile(p.resolve(publicDir, 'index.html'), (error, data) => {
        if (error) throw error;
        response.end(data.toString());
      });
      break;
    case '/style.css':
      response.setHeader('content-Type', 'text/css;charset=utf-8');
      fs.readFile(p.resolve(publicDir, 'style.css'), (error, data) => {
        if (error) throw error;
        response.end(data.toString());
      });
      break;
    case '/main.js':
      response.setHeader('content-Type', 'text/javascript;charset=utf-8');
      fs.readFile(p.resolve(publicDir, 'main.js'), (error, data) => {
        if (error) throw error;
        response.end(data.toString());
      });
      break;
  }
});

server.listen(8888);
b06a2ec4eafa3550522aa20de55215c2.png

我们使用pathname就可以过滤查询参数

因此

import * as http from 'http';
import {IncomingMessage, ServerResponse} from 'http';
import * as fs from 'fs';
import * as p from 'path';
import * as url from 'url';


const server = http.createServer();
const publicDir = p.resolve(__dirname, 'public');
server.on('request', (request: IncomingMessage, response: ServerResponse) => {
  const {url:path, method, headers} = request;
  const {pathname,search} = url.parse(path)
  console.log(pathname);
  switch (pathname) {
    case '/index.html':
      response.setHeader('content-Type', 'text/html;charset=utf-8');
      fs.readFile(p.resolve(publicDir, 'index.html'), (error, data) => {
        if (error) throw error;
        response.end(data.toString());
      });
      break;
    case '/style.css':
      response.setHeader('content-Type', 'text/css;charset=utf-8');
      fs.readFile(p.resolve(publicDir, 'style.css'), (error, data) => {
        if (error) throw error;
        response.end(data.toString());
      });
      break;
    case '/main.js':
      response.setHeader('content-Type', 'text/javascript;charset=utf-8');
      fs.readFile(p.resolve(publicDir, 'main.js'), (error, data) => {
        if (error) throw error;
        response.end(data.toString());
      });
      break;
  }
});

server.listen(8888);
be3f85c21c7fa15cc7fe78abb1e4c8c0.png
41feb59be89a36dd15cd10cfbd56ae63.png

错误处理

import * as http from 'http';
import {IncomingMessage, ServerResponse} from 'http';
import * as fs from 'fs';
import * as p from 'path';
import * as url from 'url';


const server = http.createServer();
const publicDir = p.resolve(__dirname, 'public');
server.on('request', (request: IncomingMessage, response: ServerResponse) => {
  const {url: path, method, headers} = request;
  const {pathname, search} = url.parse(path);
  const fileName = pathname.substr(1);

  response.setHeader('content-Type', `text/html;charset=utf-8`);
  fs.readFile(p.resolve(publicDir, fileName), (error, data) => {
    if (error) {
      if (error.errno === -4058 || error.errno === -2) {
        response.statusCode = 404;
        fs.readFile(p.resolve(publicDir, '404.html'), (error, data) => {
          response.end(data);
        });
      } else if(error.errno === -21){
        response.statusCode = 403
        response.end('没有权限')
      }else {
        response.statusCode = 500;
        console.log(error);
        response.end('服务器炸了');
      }
    } else {
      response.end(data);
    }
  });
});

server.listen(8888);

处理非get请求

import * as http from 'http';
import {IncomingMessage, ServerResponse} from 'http';
import * as fs from 'fs';
import * as p from 'path';
import * as url from 'url';


const server = http.createServer();
const publicDir = p.resolve(__dirname, 'public');
server.on('request', (request: IncomingMessage, response: ServerResponse) => {
  const {url: path, method, headers} = request;
  const {pathname, search} = url.parse(path);

  if (method !== 'GET') {
    response.statusCode = 405;
    response.end();
    return;
  }

  let fileName = pathname.substr(1);
  if (fileName === '') {
    fileName = 'index.html';
  }
  response.setHeader('content-Type', `text/html;charset=utf-8`);
  fs.readFile(p.resolve(publicDir, fileName), (error, data) => {
    if (error) {
      if (error.errno === -4058 || error.errno === -2) {
        response.statusCode = 404;
        fs.readFile(p.resolve(publicDir, '404.html'), (error, data) => {
          response.end(data);
        });
      } else if (error.errno === -21) {
        response.statusCode = 403;
        response.end('没有权限');
      } else {
        response.statusCode = 500;
        console.log(error);
        response.end('服务器炸了');
      }
    } else {
      response.end(data);
    }
  });
});

server.listen(8888);

添加缓存选项

如果我们经常加载一个网页 那么多次请求会印象效率 因此我们可以添加缓存 然后页面就不必被每次加载 这样可以提升性能

17589f8709f0f9a433a865adce117733.png
import * as http from 'http';
import {IncomingMessage, ServerResponse} from 'http';
import * as fs from 'fs';
import * as p from 'path';
import * as url from 'url';


const server = http.createServer();
const publicDir = p.resolve(__dirname, 'public');
server.on('request', (request: IncomingMessage, response: ServerResponse) => {
  const {url: path, method, headers} = request;
  const {pathname, search} = url.parse(path);

  if (method !== 'GET') {
    response.statusCode = 405;
    response.end();
    return;
  }

  let fileName = pathname.substr(1);
  if (fileName === '') {
    fileName = 'index.html';
  }
  response.setHeader('content-Type', `text/html;charset=utf-8`);
  fs.readFile(p.resolve(publicDir, fileName), (error, data) => {
    if (error) {
      if (error.errno === -4058 || error.errno === -2) {
        response.statusCode = 404;
        fs.readFile(p.resolve(publicDir, '404.html'), (error, data) => {
          response.end(data);
        });
      } else if (error.errno === -21) {
        response.statusCode = 403;
        response.end('没有权限');
      } else {
        response.statusCode = 500;
        console.log(error);
        response.end('服务器炸了');
      }
    } else {
      response.setHeader('Cache-Control',`public, max-age=31536000`)
      response.end(data);
    }
  });
});

server.listen(8888);

5363cdb1161c2595b1cdd801f7715ad2.png

相关文章:

  • python相关知识介绍_Python基础知识(一)—简介
  • easyui datagrid url不请求请求_渗透或CTF中使用请求头绕过认证模式
  • 子程序调用与宏定义的异同_新代系统:宏编程的基本概念和基本书写格式
  • python小结和体会_Python学习心得总结
  • jar包对比工具_如何下载Commons下的IO组件以及工具类的使用
  • recyclerview放不同的布局_一页PPT,7种不同的修改方法!非常好用!
  • python二维数组变成三维数组_Python reshape的用法及多个二维数组合并为三维数组的实例...
  • dockerhub删除镜像_Docker镜像获取(gcr.io等)
  • excel量化交易模板_使用EXCEL计算并绘制ATR指标
  • js json转string_我从Vue源码中学到的一些JS编程技巧
  • 应用程序拒绝访问_照片视频不要乱拍,超过1000个APP,拒绝权限后也能收集数据...
  • 为什么启动不起来文件和打印机共享(回显请求-icmpv4)_看了不后悔,不看悔一生的“进大厂强推的Java面试知识点”,你一定错过了...
  • python小工具脚本_python小工具
  • jieba分词_北大pkuseg分词 和 jieba 分词对比测试,结果出乎意料...
  • python开发的k线系统_【开源一个用于回测的Python交互K线工具】之【一】K线核心功能...
  • Dubbo 整合 Pinpoint 做分布式服务请求跟踪
  • nodejs:开发并发布一个nodejs包
  • Python连接Oracle
  • 前端面试之CSS3新特性
  • 如何编写一个可升级的智能合约
  • 世界上最简单的无等待算法(getAndIncrement)
  • RDS-Mysql 物理备份恢复到本地数据库上
  • #13 yum、编译安装与sed命令的使用
  • #ifdef 的技巧用法
  • #传输# #传输数据判断#
  • $NOIp2018$劝退记
  • (3)nginx 配置(nginx.conf)
  • (pojstep1.1.1)poj 1298(直叙式模拟)
  • (TOJ2804)Even? Odd?
  • (zt)最盛行的警世狂言(爆笑)
  • (阿里巴巴 dubbo,有数据库,可执行 )dubbo zookeeper spring demo
  • (超详细)2-YOLOV5改进-添加SimAM注意力机制
  • (附源码)springboot 校园学生兼职系统 毕业设计 742122
  • (附源码)计算机毕业设计ssm高校《大学语文》课程作业在线管理系统
  • (附源码)计算机毕业设计ssm基于B_S的汽车售后服务管理系统
  • (附源码)计算机毕业设计SSM在线影视购票系统
  • (原創) 如何解决make kernel时『clock skew detected』的warning? (OS) (Linux)
  • (转)总结使用Unity 3D优化游戏运行性能的经验
  • ***原理与防范
  • .apk 成为历史!
  • .form文件_一篇文章学会文件上传
  • .Mobi域名介绍
  • .NET 3.0 Framework已经被添加到WindowUpdate
  • .NET CF命令行调试器MDbg入门(一)
  • .NET高级面试指南专题十一【 设计模式介绍,为什么要用设计模式】
  • .net通用权限框架B/S (三)--MODEL层(2)
  • @media screen 针对不同移动设备
  • @ModelAttribute使用详解
  • @Transactional 详解
  • [bzoj 3534][Sdoi2014] 重建
  • [DAX] MAX函数 | MAXX函数
  • [HarekazeCTF2019]encode_and_encode 不会编程的崽
  • [Java、Android面试]_05_内存泄漏和内存溢出
  • [LeetCode] Contains Duplicate
  • [Linux] 进程间通信基础