//定义服务器响应状态码和内容解析格式,
//两个参数,第一个状态码,第二个是对象,实际上存储的就是响应头里面的信息
res.writeHead(200,{
'content-type': 'text/html;charset=utf8',
//以html格式解析响应内容,且编码格式为utf-8
})
一,请求参数
二,get请求参数
以问号作为开始标志,以键值对方式存储,用&隔开。
那服务器端如何获取这些参数呢?
它要想能够获取,则客户端必然需要先传递。
而这个请求参数是在地址栏当中,也就是说,我们可以通过req.url取得!
在服务器的代码中添加:
console.log(req.url)
在地址栏中输入这个:http://localhost:3000/index?name=zhangsan&age=20
可以看到,req.url确实获取到了这个信息,但是问题是这个信息是字符串形式连接在一起的,为了好管理和访问,我们肯定是希望它能变成对象中的属性值,类似于下图这样:
{
name:zhangsan,
age:20
}
可喜的是,在node.js中提供了一个内置模块url来处理这一过程:
先在服务器代码中引入这个模块:
const url=require('url')
在url这个内置模块下,有一个方法:parse(解析)。
于是可以写代码:
console.log(req.url)
console.log(url.parse(req.url))
它把我们想要的放置在对象内了 ,但这依旧不是我们想要的。
需要给这个parse方法,添加第二个参数:true,就是把查询的参数转化为我们想要的对象!
修改代码如下:
console.log(req.url)
console.log(url.parse(req.url,true))
这个对象中的query属性,就是我们想要的对象,它存储着我们想要的信息。
由此,我们就可以通过访问对象的属性获取对应的参数了。
console.log(req.url)
let params=url.parse(req.url,true).query
console.log(params.name)
console.log(params.age)
又注意到,parse返回的对象中,对我们有用的其实就是这两个属性值:
所以可以用解构赋值的方式修改代码:
let {query,pathname}=url.parse(req.url,true)
console.log(query.name)
console.log(query.age)
这样就方便很多了。
因为此时的req.url包含了参数信息,所以不好用了,而此时的pathname就是正常的访问地址,所以可以用它:
let {query,pathname}=url.parse(req.url,true)
console.log(query.name)
console.log(query.age)
//根据用户访问的地址不同,显示不同的界面
// console.log(req.url)
if (pathname == '/index' || pathname == '/'){
res.end('<h3>我是成功请求之后的响应内容</h3>')
}else if(pathname == '/list'){
res.end('welcome to listpage')
}else{
res.end('not found')
}
三,post请求参数
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<form method="post" action="http://localhost:3000/">
<input type="text" name="username">
<input type="password" name="password">
<input type="submit">
</form>
</body>
</html>
Form Data 这一项,存储的就是post请求参数。
现在我们已经知道如何从客户端发送post请求到服务器端,那服务器端又如何接收这些参数呢?
const http=require('http')
const app=http.createServer()
app.on('request',(req,res)=>{
//post参数是通过事件的方式接受的
//data 当请求参数传递的时候触发data事件
//end 当参数传递完成的时候触发end事件
//事件绑定到req对象上面。
//由于post参数很多,不是一次性就接收完的,所以需要生声明一个变量
//当data事件触发之后,进行拼接。
let postParams=''
req.on('data',params=>{
postParams += params
})
req.on('end',()=>{
console.log(postParams)
})
res.end('OK')
//对于客户端的每次请求,服务器端都要做出响应,否则客户端将处于等待状态
//这里就意思性地进行响应一下。
})
app.listen(3000)
console.log("网站服务器启动成功")
另一个代码:
<form method="post" action="http://localhost:3000/">
<input type="text" name="username">
<input type="password" name="password">
<input type="submit">
</form>
编写服务器代码和页面代码如上,执行代码后如下:
也就是说,通过data和end事件,我们地服务器,已经收到了这个报文
并且取得了参数和值。但依旧是字符串混在一起的,同样,我们希望它们能够保存在一个对象中。
在node.js中给我们提供了另外一个内置模块,用来处理这样的参数字符串。
这个模块叫做querystring
需要在服务器代码中先引入这个内置模块对象。
const querystring=require('querystring')
在这个对象下,有一个同样名为parse的方法来处理这样的参数。
let postParams=''
req.on('data',params=>{
postParams += params
})
req.on('end',()=>{
console.log(querystring.parse(postParams))
})
res.end('OK')
这样就也转化为对象的形式存储了。