http模块是Node.js网络的关键模块,主要用于搭建HTTP服务端和客户端。
创建服务器
//引入
const http = require('http')
// 创建服务器:使用http模块提供的createServer方法,该方法会返回一个http.Server类的新实例
/* http.ServerResponse:由http.Server创建并作为第二个参数传给它出触发的request事件(即下文的res)*/
const server = http.createServer((req, res) => {
res.end('Hello World')
})
/*拥有服务器后可以访问其方法:listen()启动服务器并监听连接;close()停止服务器不再接受新连接*/
server.listen('3000', () => {
console.log('Server is running @ port: 3000')
})
http.createServer()
用于创建服务器,返回http.Server
类的实例。
http.Server
当使用http.createServer()
创建服务器时,通常会实例化并返回此类。
http.ServerResponse
由http.Server
创建,并作为第二个参数传递给它出发的request
事件。
end()
在事件处理函数中必须调用的方法是end()
,用来关闭响应。可以向end()
方法中传入数据,服务器会将数据响应给客户端。
write()
write()
可以在响应正文中发送数据给客户端。
setHeader(‘headername’, value)
此方法用来设置HTTP消息头的值。
// eg.
const server = http.createServer(() => {
res.setHeader('Content-type', 'text/plain;charset=utf-8');
// charset=utf-8可以避免中文乱码
res.write('你好,Lynn');
})
writeHead()
如果响应头还没被发送,则可以使用writeHead()
发送响应头,其中包括已经设置过的状态码和消息。(显示设置消息头)
/* res.writeHead(statusCode[, statusMessage][, headers])
statusCode: 状态码 <number>
statusMessage: 状态信息 <string>
headers: 消息头 <Object>
*/
res.writeHead(200, 'Success', { 'Content-Type': 'text/plain;charset=utf-8'})
statusCode & statusMessage
在使用隐式响应头(没有显示调用writeHead
)时,通过这两个属性可以分别设置响应状态码和状态消息。
res.statusCode = 200;
res.statusMessage = 'Success';
其他
getHeaderNames()
获取已设置的HTTP消息头名称列表;getHeaders()
获取已设置的HTTP消息头副本;getHeader('headername')
获取已设置的消息头;removeHeader('headername')
删除已设置的消息头;hasHeader('headername)
是否已设置该消息头,返回true/falseheaderSent()
消息头是否已被发送到客户端,返回true/false
创建客户端
const http = require('http');
const options = {
hostname: 'localhost',
port: 3001,
path: '/',
method: 'post'
}
const callback = function (response) {
let result = ''
response.on('data', (data) => {
result += data;
});
response.on('end', () => {
console.log('服务器返回的数据是' + result)
})
}
const req = http.request(options, callback);
req.write('Hello Server');
req.end();
以上代码中若不定义callback函数,可以另外监听response
事件:
// 监听response事件
req.on('response', (res) => {
// console.log(res);
let result = ''
res.on('data', (data) => {
result += data;
});
res.on('end', () => {
console.log('服务器返回的数据是' + result)
})
})
http.request() & http.get()
用于向服务器发送请求,两个方法的参数用法都差不多,区别在于http.get()
将请求方法设置为GET并会自动调用req.end()
。两者都会创建http.ClientRequest
对象。
http.request(options[, callback])
http.get(options[, callback])
http.ClientRequest
当http.request()
或http.get()
被调用时,会创建http.ClientRequest
对象。
const req = http.requset(options, callback);
读取响应数据
在response
事件处理函数中(http.IncomingMessage
作为参数),为data
事件设置事件监听器,以便监听流入的数据。
req.on('response', (res) => {
let result = '';
// 监听流入的数据
// 响应数据不一定只有一次
res.on('data', (data) => {
result += data;
});
// 数据接收完毕
res.on('end', () => {
console.log(result);
})
})
待续……