http 这个模块的职责就是帮你创建编写服务器的
在 Node 中专门提供了一个核心模块:http
1. 加载 http 核心模块
var http = require('http')
2. 使用 http.createServer() 方法创建一个 Web 服务器
// 返回一个 Server 实例
var server = http.createServer()
3. 收发数据
- 注册监听 request 请求事件
// 发请求 、接收请求 、处理请求、 给个反馈(发送响应)
// 当客户端请求过来,就会自动触发服务器的 request 请求事件,然后执行第二个参数:回调处理函数
server.on('request', function () {
console.log('收到客户端的请求了')
})
- request 请求事件处理函数
Request
请求对象:
请求对象可以用来获取客户端的一些请求信息,例如请求路径
Response
响应对象:
响应对象可以用来给客户端发送响应消息
server.on('request', function (request, response) {
// http://127.0.0.1:3000/ 请求路径就是 : /
// http://127.0.0.1:3000/a 请求路径就是 :/a
// http://127.0.0.1:3000/foo/b 请求路径就是 /foo/b
console.log('收到客户端的请求了,请求路径是:' + request.url)
// response 对象有一个方法:write 可以用来给客户端发送响应数据
// write 可以使用多次,但是最后一定要使用 end 来结束响应,否则客户端会一直等待
response.write('hello')
response.write(' nodejs')
// 告诉客户端,我的话说完了,你可以呈递给用户了
response.end()
})
- 请求路径区分
server.on('request', function (req, res) {
console.log('收到请求了,请求路径是:' + req.url)
console.log('请求我的客户端的地址是:', req.socket.remoteAddress, req.socket.remotePort)
// res.write('hello')
// res.write(' world')
// res.end()
// 上面的方式比较麻烦,推荐使用更简单的方式,直接 end 的同时发送响应数据
// res.end('hello nodejs')
// 1. 获取请求路径, req.url 获取到的是端口号之后的那一部分路径。
//也就是说所有的 url 都是以 / 开头的
// 2. 判断路径处理响应
var url = req.url
if (url === '/') {
res.end('index page')
} else if (url === '/login') {
res.end('login page')
} else if (url === '/products') {
var products = [{
name: '苹果 X',
price: 8888
},
{
name: '菠萝 X',
price: 5000
},
{
name: '小辣椒 X',
price: 1999
}
]
// 响应内容只能是二进制数据或者字符串 、数字、 对象、 数组、 布尔值
res.end(JSON.stringify(products))
} else {
res.end('404 Not Found.')
}
})
- 编码
在服务端默认发送的数据,其实是 utf8 编码的内容 , 但是浏览器不知道你是 utf8 编码的内容
浏览器在不知道服务器响应内容的编码的情况下会按照当前操作系统的默认编码去解析
中文操作系统默认是 gbk
在 http 协议中,Content-Type 就是用来告知对方我给你发送的数据内容是什么类型
res.setHeader('Content-Type', 'text/plain; charset=utf-8')
server.on('request', function (req, res) {
var url = req.url
if (url === '/plain') {
// text/plain 就是普通文本, charset=utf-8 设置utf-8编码
res.setHeader('Content-Type', 'text/plain; charset=utf-8')
res.end('hello 世界')
} else if (url === '/html') {
// 如果你发送的是 html 格式的字符串,则也要告诉浏览器我给你发送是 text/html 格式的内容
res.setHeader('Content-Type', 'text/html; charset=utf-8')
res.end('<p>hello html <a href="">点我</a></p>')
}
})
4. 绑定端口号,启动服务器
server.listen(3000, function () {
console.log('服务器启动成功了,可以通过 http://127.0.0.1:3000/ 来进行访问')
})
5. 简写方式
var http = require('http');
// 简写方式,该函数会直接被注册为 server 的 request 请求事件处理函数
http
.createServer(function (req, res){
//数据注册直接在函数内完成了
//req就是请求数据,res就是需要返回的数据对象
}
.listen(3000, function () {
console.log('服务器启动成功了,可以通过 http://127.0.0.1:3000/ 来进行访问')
})