NodeJS中http模块开发

Posted 还是不会呀

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NodeJS中http模块开发相关的知识,希望对你有一定的参考价值。

web服务器初体验

两种创建方式

const http = require("http");
// 创建方式一 http.createServer
const server1 = http.createServer((request, response) => {
  response.end("hello server1");
});
// 设置监听端口
server1.listen(8080, "0.0.0.0", () => {
  console.log("服务器开启成功~");
});
// 创建方式二 http.Server类
const server2 = new http.Server((request, response) => {
  response.end("hello server2");
});

server2.listen(8081, "0.0.0.0", () => {
  console.log("服务器开启成功~");
});

浏览器请求效果

其他补充

// server方式可以不传端口和主机host
server.listen(() => {
  console.log(server.address().port);// 获取默认设置的端口
});

request对象

method的处理

根据Restful风格,增删给查对应不同得请求方式

  • GET:查询数据
  • POST:新增数据
  • PATCH:修改数据
  • DELETE:删除数据
// 不同的请求方式打印结果不同 可能结果 GET/POST/PATCH/DELETE
console.log(request.method); 

url的处理

GET请求处理

携带的参数一般是放在URL上,如Get请求:http://localhost:8080/login?username=fzb&password=123456如何进行解析

const url = require("url");
const qs = require("querystring");
//省略大部分代码......
const { pathname, query } = url.parse(request.url);
const { username, password } = qs.parse(query);
console.log(pathname, username, password); // /login fzb 123456

POST请求处理

POST请求数据一般是放在请求体body里面的,POST请求可以添加文件,那么不可能一个请求就可以把数据完整传过去,那么就需要采用的方式接收

var result = "";
  //   request.setEncoding("utf-8");
  request.on("data", (data) => {
    console.log(data); // 结果是Buffer类型的数据,如果想对传过来的数据直接转换,取到的data直接是解码好的, 上方加入 request.setEncoding("utf-8");
    result += data; // 字符串拼接时自动调用toString转换了
  });
  // 同时还可以监听end事件,一样的效果
  request.on("close", () => {
  console.log(result);
  console.log("数据传送完成~,结果是:", result);
  const { username, password } = JSON.parse(result);
  console.log(username, password); // fzb 123456
});

headers的处理

console.log(request.headers);
//   {
//     'content-type': 'application/json',
//     'user-agent': 'PostmanRuntime/7.28.4',
//     accept: '*/*',
//     'postman-token': '3f6f73e9-c26b-495b-a18e-99b5dfed16d6',
//     host: 'localhost:8080',
//     'accept-encoding': 'gzip, deflate, br',
//     connection: 'keep-alive',
//     'content-length': '50'
//   }

content-type:请求携带的数据类型

  • application/json:请求携带的数据是json类型的
  • application/xml:请求携带的数据是xml类型的
  • text/plain:请求携带的数据是文本类型的
  • multipart/formdata:请求携带文件

user-agent:客户端的信息

accept:客户端可以接收的文件类型

token:token数据可以放在headers内

accept-encoding:客户端可以接受的编码方式

connection:keep-alive,请求结束后默认保持连接,保持连接的时间是有限的,Node内是5s

content-lenght:携带数据的长度(大小)

response对象

返回响应结果

其实本质上requestresponse对象,继承自Stream,那么返回响应结果,这样操作:

response.write("write方法");
response.end("hello server");

但是response却没有了close方法,结束响应结果只能用 end

返回状态码

告诉客户端本次请求的状态,返回对应的状态码

常见状态码

  • 200:请求成功
  • 3xx:请求重定向
  • 400:客户端错误,发送请求的语法存在错误
  • 401:客户端权限不够
  • 403:服务器拒绝服务
  • 404:无法请求到资源,一般是url地址问题
  • 5xx:服务器端错误
response.statusCode = 200;
// 或
response.writeHead(200);

响应头文件

告诉客户端请求相关信息

// 方法一:response.setHeader 一条一条设置
response.setHeader("Content-type", "application/json;chartset=utf8");
// 方法二:对象式设置响应头
response.writeHead(200, {
  "Content-type": "application/json;chartset=utf8",
});

例子:响应结果<h1>Http</h1>,浏览器接收时当字符串处理,但是想要其自动当html进行解析,该怎么做:响应头设置浏览器如何解析(Content-type)

response.writeHead(200, {
  "Content-type": "text/html;chartset=utf8",
});
response.end("<h1>http</h1>");

当html进行解析,该怎么做:响应头设置浏览器如何解析(Content-type)**

response.writeHead(200, {
  "Content-type": "text/html;chartset=utf8",
});
response.end("<h1>http</h1>");

浏览器响应展示

http模块发送网络请求

http模块除了可以用来开发服务器,还可以用来做网络请求~

发送GET请求

const http = require("http");
http.get(
  {
    host: "localhost",
    path: "/login",
    port: 8080,
  },
  (res) => {
    let result = "";
    res.on("data", (data) => {
      result += data;
    });
    res.on("end", () => {
      console.log(result);
    });
  }
);

发送POST请求

http没有post方法,只能通过request方法手动指定请求的方法。

发送完成之后,需要手动将本次请求结束。

const req = http.request(
  {
    host: "localhost",
    path: "/login",
    port: 8080,
    method: "POST",
  },
  (res) => {
    let result = "";
    res.on("data", (data) => {
      result += data;
    });
    res.on("end", () => {
      console.log(result);
    });
  }
);
req.end();

以上是关于NodeJS中http模块开发的主要内容,如果未能解决你的问题,请参考以下文章

nodejs学习笔记一( sublimeatom开发环境,http模块,fs模块的初识)

nodejs 模块恩仇录

NodeJS中的http模块

NodeJS常用模块介绍

NodeJS经常使用模块收集

当尝试将变量传递给另一个模块时,将代码拆分到Nodejs中的自定义模块时,它将被定义为未定义