前言
最近刚上手nodejs,所以目前用的是原生的node.js,本文讲一下在原生node中对于http不同的请求方法如何处理,以get和post进行举例
起航
初次接触到node的朋友,我们先来看看如何开始建立一个web服务
注释都表明在了代码中
// 导入http对象
var http = require('http')
// 创建服务器,获取服务器对象
var server = http.createServer()
// 监听端口
server.listen(8080, function () {
console.log('http://127.0.0.1:8080');
})
// 监听request事件,req是请求的所有信息,res是响应的所有信息
server.on('request', function (req, res) {
})
下面我们来看看如何处理不同的http请求
GET请求
上面我们说了,在server.on(‘request’, function (req, res) {})中,req是请求的所有信息,所有我们可以在里面使用req.method判断请求的类型是否为GET
如果要获取get请求的参数该怎么做呢?先打印req.url看看
server.on('request', function (req, res) {
// console.log(req.method)
if (req.method == "GET") {
console.log(req.url)
}
})
访问浏览器 查看控制台
能拿到/user?id=9,但是我们想要拿到id=9,如果使用正则处理又会很麻烦,这是就可以借助到另一个工具 url
直接在头部进行引入:
var url = require('url')
然后直接用url.parse进行使用,
console.log( url.parse(req.url))
打印看看:关于url所有的信息 一览无余
这里的query的值为‘id=9’,我们只想要9怎么做呢
直接在后面加一个true
console.log( url.parse(req.url,true))
query中是一个对象, url.parse(req.url,true).query.id拿到我们想要的值
以上是GET请求方法中,如何获取它的传参
POST请求
跟上面一样,使用req.method进行判断:
server.on('request', function (req, res) {
if (req.method == "GET") {
console.log(req.url)
}else if(req.method == "POST"){
}
})
post请求的数据是放在请求体中进行请求传参,所以我们需要使用Net事件获取到数据
因为http是基于Net的,所以http的请求对象可以直接使用net的事件。绑定data事件,因为数据是放在消息体当中的,消息体是分包发送的,所以每当有数据来到服务器的时候,data就会去触发,每触发一次,data事件就会执行一次,这里的参数d也就是客户端给我们传入的数据:
server.on('request', function (req, res) {
if (req.method == "GET") {
console.log(req.url)
}else if(req.method == "POST"){
req.on('data',function(d){
console.log(d);
})
}
})
因为这里post这里的数据是流数据,所以需要等待客户端把全部数据发送后再处理和打印,所以像先在前面生命一个字符串data。每次获取到数据就拼接到data中。
var data = ''
req.on('data',function(d){
data += d
})
然后我们还需要绑定end在结束之后把得到的数据进行转义处理:
var data = ''
req.on('data',function(d){
data += d
})
req.on('end',function(){
console.log( require('querystring').parse(data))
})
进行post请求然后查看,这样就获取到了post传来的数据
总结
以上就是关于原生nodejs中如何获取和接收GET.POST请求中的数据,post中获取数据相对麻烦一些。因为http的封装相对底层,http的核心模块只帮我们处理流数据,具体的数据内容需要借助Net里面的data事件和end事件,来进行数据的接收然后使用querystring对数据进行解析和处理