http模块简介
http模块中封装了一个HTTP服务器和一个简易的HTTP客户端:使用http.Server类创建一个基于事件的HTTP服务器,而使用http.request()和http.get()方法则可以作为HTTP客户端向服务器发起请求。
1、http.Server 类:用于创建HTTP服务器,使用时需要先实例化;
2、http.ClientRequest 类:该对象在 http.request() 内部被创建并返回。它表示着一个正在处理的请求;
3、http.IncomingMessage 类:IncomingMessage对象由 http.Server 或 http.ClientRequest 创建,并作为第一个参数分别传递给 'request' 和 'response' 事件。 它可以用来访问响应状态、消息头、以及数据。它实现了可读流接口;
4、http.ServerResponse 类:ServerResponse对象由http.Server创建,并作为第二个参数传递给 'request' 事件。它实现了可写流接口;
5、http.createServer( [callback] )方法:返回一个http.Server对象,callback会被自动添加到 'request' 事件中;
6、http.request( options[, callback] )方法:作为http客户端,向服务器发送请求,可选参数callback会被自动添加到 'response'事件中;
7、http.get( options[, callback] )方法:http.request()方法的简化版,主要区别是http.get()自动将请求方法设为了"GET",同时不需要手动调用req.end();
http创建服务器
// 服务器
var http = require("http")
var fs = require("fs")
var path = require("path")
var app = http.createServer(function (req, res) {
// 如果请求的是ico图标 不返回数据
if (req.url.includes(".ico")) { return res.end() }
// if(req.url.includes(".txt")) 设置mime类型 text/plain
// data 事件 请求数据在传递过程中,有可能会多次执行data事件
req.on("data", function (d) {
console.log(d.toString());
})
// 数据请求结束时
req.on("end", function (e) {
console.log("本次请求结束");
})
// 设置响应头
res.writeHead(200, {
"Content-Type": "text/plain"
})
// 读取文件
fs.readFile(__dirname + req.url, function (err, data) {
if (err) {
res.end("404")
}else{
res.end(data.toString())
}
})
})
// 监听
app.listen(8080, function () {
console.log("running");
})
http.request()发送GET请求
var http = require("http")
var option = {
host: "localhost", // ip地址
port: 8080, //端口
method: "GET", //请求方式
path: "/1.txt", // 文件路径
headers:{
"Content-Type":"text/plain" // 请求头
}
}
// 使用http模块的request()向http服务器发送请求
var req = http.request(option, function (res) {
let info = ""
res.on("data", function (chunk) {
console.log('1111');
info += chunk.toString()
})
res.on("end", function (err) {
console.log(info);
})
})
//使用http.request()必须总是调用req.end()来表明请求的结束,即使没有数据被写入请求体;
req.end()
关于http.request(options[, callback]):options是一个对象,包含了请求的相关参数:http://nodejs.cn/api/http.html#http_http_request_options_callback
可选参数callback会作为单次监听器被添加到”response“事件,即当请求的响应被接收到时就会调用该回调函数。它在被执行时带有一个参数res,该参数是一个 http.IncomingMessage类的实例。返回值是一个http.ClientRequest 类的实例,它表示着一个正在处理的请求。如果请求过程中遇到任何错误,则在返回的请求对象中会触发"error"事件;
使用http.request()必须总是调用req.end()来表明请求的结束,即使没有数据被写入请求体;
http.request()发送POST请求
var http = require("http")
var querystring = require("querystring")
// 在传递的时候必须传递字符串
var data = querystring.stringify({
name: "zhangsan",
age: 10
})
var option = {
host: "localhost",
port: "8080",
method: "POST",
headers: {
"Content-Type": "application/x-www-form-urlencode",
// 必须是在请求头里面设置内容的长度
"Content-Length": Buffer.byteLength(data) // 获取数据长度
}
}
var req = http.request(option, function (res) {
let info = ""
res.on("data", function (chunk) {
console.log('1111');
info += chunk.toString()
})
res.on("end", function (err) {
console.log(info);
})
})
// 把请求数据放在请求体里面
req.write(data)
req.end()