《nodejs 10实战》

http模块

创建http服务器和客户端

创建简单的nodejs服务器端

const http = require('http');
const server = http.createServer(function (req, res) {
    res.writeHead(200, {'Content-type': 'text-plain'});
    res.end('hello nodejs')
})

server.listen(3010, function () {
    console.log('listening port 3010')
})
1
2
3
4
5
6
7
8
9

http.createServer()方法返回的是http模块封装的一个基于事件的http服务器。 同样,http.request是其封装的一个http客户端工具,可以用来向http服务器发起请求。 上面的req和res分别是http.IncomingMessage和http.ServerResponse的实例。

http.Server的事件主要有:

  • request:最常用的事件,当客户端请求到来时,该事件被触发,提供req和res两个参数,表示请求和响应信息。
  • connection:当TCP连接建立时,该事件被触发,提供一个socket参数,是net.Socket的实例。
  • close:当服务器关闭时,触发事件(注意不是在用户断开连接时)。

http.createServer其实就是添加了一个request事件监听

const http = require('http');
const server = new http.Server();

server.on('request', function (req, res) {
    res.writeHead(200, {'content-type': 'text/plain'});
    res.end('hello nodejs')
})

server.listen(3030, function () {
    console.log('listening in localhost:3030')
})
1
2
3
4
5
6
7
8
9
10
11

http.incomingMessageopen in new window 是HTTP请求的信息,提供3个事件

  • data
  • end
  • close

http.IncomingMessage提供的属性主要有:

  • method:HTTP请求的方法,如GET。
  • headers:HTTP请求头。
  • url:请求路径。
  • httpVersion:HTTP协议的版本

融合上述知识

const http = require('http');
const server = http.createServer(function (req, res) {
    let data = '';
    req.on('data', function (chunk) {
        data += chunk
    });
    req.on('close', function () {
        let method = req.method;
        let url = req.url;
        let headers = JSON.stringify(req.headers);
        let httpVersion = req.httpVersion;
        res.writeHead(200, {'content-type': 'text/html'});
        let dataHTML = `<p>data:${data}</p>`;
        let methodHTML = `<p>method:${method}</p>`;
        let urlHTML = `<p>url:${url}</p>`;
        let headersHTML = `<p>headers:${headers}</p>`
        let httpVersionHTML = `<p>httpVersion:${httpVersion}</p>`
        let resData 
        = dataHTML + methodHTML + urlHTML + headersHTML + httpVersionHTML;
        res.end(resData);
    })
})
server.listen(4399, function () {
    console.log('来呀,快活呀')
})
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

http.ServerResponse是返回给客户端的信息,其常用的方法为:

  • res.writeHead(statusCode,[headers]):向请求的客户端发送响应头。
  • res.write(data,[encoding]):向请求发送内容。
  • res.end([data],[encoding]):结束请求。

客户端向ttp服务器发送请求

以上方法都是http模块在服务器端的使用,接下来看客户端的使用。向http服务器发起请求的方法有:

  • http.request(option[,callback]):option为json对象,主要字段有host、port(默认为80)、method(默认为GET)、path(请求的相对于根的路径,默认是“/”)、headers等。该方法返回一个httpClientRequest实例。
  • http.get(option[,callback]):http.request()使用HTTP请求方式GET的简便方法。
const http = require('http');
let reqData = '';
http.request({
    'host':'127.0.0.1',
    'port':'3000',
    'method':'get'
},function(res){
    res.on('data',function(chunk){
        reqData+=chunk;
    });

    res.on('end',function(){
        console.log(reqData)
    })
}).end()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

利用http.get()方法也可以实现同样的效果

File not found

与服务端一样,http.request()和http.get()方法返回的是一个http.ClientRequest()实例。

http.ClientRequest()类主要的事件和方法有:

  • response:当接收到响应时触发。
  • request.write(chunk[,encoding][,callback]):发送请求数据。
  • res.end([data][,encoding][,callback]):发送请求完毕,应该始终指定这个方法。
const http = require('http');
let reqData = '';

let option = {
    'host': '127.0.0.1',
    'port': '3000'
};
const req = http.request(option);
req.on('response', function (res) {
    res.on('data', function (chunk) {
        reqData += chunk
    })

    res.on('end', function () {
        console.log(reqData)
    })
})
Í
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

http2模块

url模块

使用url模块只需要在文件中通过require('url')引入即可。

url模块是一个分析、解析url的模块,主要提供以下三种方法:

  • url.parse(urlStr[,parseQueryString][,slashesDenoteHost]):解析一个url地址,返回一个url对象。
  • url.format(urlObj):接收一个url对象为参数,返回一个完整的url地址。
  • url.resolve(from, to):接收一个base url对象和一个href url对象,像浏览器那样解析,返回一个完整地址。
const url = require('url');
let parseUrl = 'http://nodejs.cn/api/url.html#class-url'

let urlObj = url.parse(parseUrl)

console.log(urlObj)
1
2
3
4
5
6
Last Updated: 3/21/2022, 8:17:56 AM
Contributors: mac_ajn404, Ajn404