node.js之http模块

68 阅读4分钟

前言

http是前端特别熟悉的概念,而且经常和后端请求数据。有了http模块之后,我们就可以自己起一个服务,甚至都不需要后端就能完成一些demo了。在node.js中,http模块是一个很复杂,也是一个很核心的模块。我们我篇文章就主要从客户端和服务端的角度介绍http模块。

http服务

http服务是在服务端和客户端之间完成的。

  • 客户端client: 向服务端发起请求,获取服务器返回的内容
  • 服务端server: 接收客户端的请求,处理请求并将结果返回给客户端。

这篇文章主要是介绍Node.js中http模块的用法,对于请求头,请求体,响应头,响应体的具体内容在这里就不展开介绍了,感兴趣的可以参考我的前端路线专栏中关于http的介绍的文章。

1. http请求

http请求是在req对象上的,关于请求,服务端和客户端分别要完成以下事情。

  • 服务端:获取请求方的信息,如请求头等
  • 客户端:发送请求。

1.1 服务端

对于服务端来说,当然是创建服务了,整个主要是通过http的createServer来实现的

    const http = require('http');

    // 创建一个服务
    const server = http.createServer((req, res) => {
      console.log('请求头', req.headers);
      res.end('请求成功');
    });
    server.listen(3000);

对于服务点来说,以下几个主体特别重要

  1. server: http.Server实例,用来提供服务,处理客户端的请求
  2. req: http.IncomingMessage实例。serverReq 用来获取客户端请求的相关信息, 比如请求头,请求体
  3. res: http.ServerResponse实例,用来设置响应体的内容,请求方法,状态码等

1.2 客户端

对于客户端来说,就是请求服务了,这个我们应该很熟悉。

    const client = http.get('http://127.0.0.1:3000', (res) => {
      console.log('res', res);
    });

对于客户端来说,也有两个很重要的主体。

  1. client:http.ClientRequest实例,用来向服务端发送请求
  2. res: 也就是获取响应服务端返回的相关信息, 如响应头,响应体。

http请求服务的应用

对于服务端来说,主要有以下几个应用

1. 获取请求路径/方法/http版本/请求头

获取请求路径/方法/http版本/请求头都是在服务端的req主体里面。 示例

const http = require('http');

// 创建一个服务
const server = http.createServer((req, res) => {
  console.log('请求路径', req.url);
  console.log('请求方法', req.method);
  console.log('http版本', req.httpVersion);
  console.log('请求头', req.headers);
  res.end('请求成功');
});
server.listen(3000);

当发起请求时就可以看到以下内容:

image.png

2. 获取get请求参数

对于get请求,我们经常会携带一些参数。对于路径拼接的在这类参数,可以通过url的query获取。

const http = require('http');
const url = require('url');
const querystring = require('querystring');

// 创建一个服务
const server = http.createServer((req, res) => {
  console.log('请求路径', req.url);
  const urlObj = url.parse(req.url);
  // 获取query
  const query = urlObj.query;
  console.log('get请求参数', query);
  const queryObj = querystring.parse(query);
  console.log( 'get请求参数转化后', JSON.stringify(queryObj) );
  res.end('请求成功');
});
server.listen(3000);

通过在浏览器访问http://127.0.0.1:3000/test?name=Tom&age=18 效果如下:

image.png

3. 获取post请求参数

post请求需要创建一个表单

<form action="http://127.0.0.1:3000" method="post">
    <input type="text" name="name"  />
    <input type="password" name="pwd"  />
    <input type="submit"   value="按钮" />
  </form>

对于post请求的参数,需要给req主体绑定data事件才能拿到

const http = require('http');
// 创建一个服务
const server = http.createServer((req, res) => {
  let params = '';
  req.on('data', (param) => {
    params += param;
  })
  res.on('end', () => {
    console.log('post请求参数', params);
    res.end('ok');
  })
});
server.listen(3000);

效果如下:

image.png

2. http响应

http响应服务主要就是针对服务端的res来进行设置的,我们可以设置状态码,状态描述信息,响应头,响应主体。

1. 设置状态码和描述信息

设置状态码和描述信息可以使用res.writeHead()来设置,也可以使用res.statusCode/res.statusMessage()来实现

const server = http.createServer((req, res) => {
  res.writeHead(200, 'true');
  res.statusCode = 200;
  res.statusMessage = 'true';
  res.end('ok');
});
server.listen(3000);

效果如下:

image.png

2. 设置响应头

设置响应头可以通过res.writeHead()和res.setHeader()来实现。

const server = http.createServer((req, res) => {
  res.writeHead(200'true', {
    'Content-Type': 'text-plain'
  });
  res.setHeader('Content-Type', 'text-plain');
  res.end('ok');
});
server.listen(3000);

效果如下:

image.png 需要注意的是 已经通过 res.setHeader() 设置了header,当通过 res.writeHead() 设置同名header,res.writeHead() 的设置会覆盖之前的设置。

3. 设置响应体

响应体主要可以通过res.write()和res.end()方法来设置

const server = http.createServer((req, res) => {
  res.write('ok');
  res.end('ok');
});
server.listen(3000);

效果如下:

image.png

到目前为止,这篇文章主要介绍http的常见用法,想要了解更加复杂的用法,建议参考Node官网