HPPT请求与响应处理
GET请求参数
参数被放置在浏览器地址栏中,例如:http://localhost:3000/?name=zhangsan&age=20.?后面是请求参数,也就是额外携带的数据。
在Node.js提供了内置模块,可以通过内置模块中的方法,来处理这个请求参数。
引入内置模块url(这个模块用来处理URL请求地址):
const url = require('url');
url这个模块下面有一个parse方法,用来解析url。
//parse方法最后会返回一个对象,会把url里面的各个部分都放到对象的一个 //属性里面。 url.parse(req.url,true)
parse里面有两个参数,第一个参数是要解析的url地址,第二个参数是将'查询参数'解析成对象形式。
- //url里面的属性: //search:查询参数 //query:和search差不太多,区别是search后面有?,query后面没有? //pathname:请求地址
- 参数被放置在浏览器地址栏中
- 获取get参数使用req.url
POST请求参数
<form method="post" action="http://localhost:3000"> <input type="text" name="username"> <input type="password" name="password"> <input type='submit'> </form>
post参数是通过事件的方式接收的,data事件和end事件。post参数理论上数据量可以是无限的,作为服务器来讲为了减轻压力,post参数不是一次就接收完的。比如说传递一个100兆的数据,可能分10次接收,每一次接收10兆。当有请求参数传递的时候就会触发data事件,当请求参数传递完成时会触发end事件。
const http = require('http'); const app = http.createServer();
//处理服务器端接收到的字符串
const querystring = require('querystring'); app.on('request',(req,res)=>{ //由于post参数不是一次传递完的,所以需要声明一个变量,当触发data时将传递过来的参数与声明的变量进行拼接。
let postParams = ''; req.on('data',params=>{
postParams+=params;
}) })
//当end事件触发时,输出参数。
req.on('end',()=>{
//使用querystring下的parse方法,将postParams转换为对象
console.log(querystring.parse(postParams));
})
res.end('ok')
})
- post参数被放置在请求体中进行传输
- 获取post参数需要使用data事件和end事件
- 获取到的post参数是一个字符串的格式,使用内置模块querystring下的parse方法把参数转换为对象格式
静态资源
静态资源:服务器端不需要处理可以直接响应给客户端的资源就是静态资源,例如CSS、JavaScript、image文件。
//静态资源访问 const http = require('http'); const url = require('url'); const path = require('path'); const fs = require('fs'); //mime这个第三方模块的功能是根据当前的请求路径,分析出这个资源的类型,通过返回值的方式返回资源类型。 const mime = require('mime'); const app = http.createServer(); //监听服务器 app.on('request',(req,res)=>{ //获取用户请求路径 let pathname = url.parse(req.url).pathname pathname = pathname =='/'? '/index.html': pathname //将用户的请求路径转换为实际的服务器硬盘路径 let realpath = path.join(__dirname,'public'+pathname) console.log(realpath) let type = mime.getType(realpath) // console.log(type); fs.readFile(realpath,(error,result)=>{ if(error != null){ res.writeHead(404,{ 'content-type':'text/html;charset=utf8' }) res.end('文件读取失败') return; } res.writeHead(200,{ 'content-type' : type }) res.end(result) }) }); app.listen(80); console.log('服务器启动成功!')
动态资源
动态资源:相同的请求地址可以传递不同的请求参数,得到不同的响应资源,这种资源就是动态资源。