本文共 4156 字,大约阅读时间需要 13 分钟。
服务器上有很多的资源,每个资源都有自己的url。客户端浏览器想要访问某个资源就要向服务器发起对应的请求。
index.html, style.css, index.js
。接口
服务器上的一段代码
,访问接口时,服务器会执行这段代码,然后把代码的执行结果返回给客户端浏览器。 提供一个名为getList的接口(http://localhost:8083/getList
),它以json字符串格式返回db/data.json的内容。
使用postman软件进行测试。
|-db|---data.json # 数据|-server.js # 你的代码
// server.jsconst http = require('http');const app = http.createServer((req, res) => { if (req.url === '/getmsg' && req.method=== 'GET') { const filePath = path.join(__dirname, 'db', 'data.json') let const = fs.readFileSync(filePath, 'utf8') res.end(const); } else { res.end('error'); }});app.listen(8083, () => { console.log(8083);});
req.method
可以判断请求的类型res.end()
的参数只能是字符串(或者是buffer
),而不能是对象提供一个名为getList
的接口(http://localhost:8083/getList?name=xxxx
),它以json字符串格式返回db/data.json中name为xxxx的数据
使用postman软件进行测试。
|-db|---data.json # 数据|-server.js # 你的代码
const fs = require('fs')const path = require('path')const http = require('http')const qs = require('querystring')http.createServer((req, res) => { // get请求带参数 let [url, queryStr] = req.url.split('?'); //通过请求体 拿到url路径 用?分割成数组 结构赋值给 url 和 queryStr let qsObj = qs.parse(queryStr); //使用核心模块querystring 分割查询字符串 let filePath = path.join(__dirname, 'db', 'data.json'); //拼接一个data.json的绝对路径 if (url === '/getList' && req.method === 'GET') { //如果请求的路径是/getList 请求类型是get let arr = JSON.parse(fs.readFileSync(filePath)); //拿到data.json的内容 解析成数组 let rs = arr.find(item => { //对数组进行查找 如果找到返回ture 没有找到返回false if (item.id == qsObj.id) { return true; } else { return false } }) console.log(rs); res.setHeader('content-type', 'application/json') res.end(JSON.stringify(rs)) //结束响应 响应体内容为拿到的返回值 } else { res.statusCode = 404; res.end('404') }}).listen(3000, () => { console.log('服务器开启 3000');})
提供一个名为add的接口(http://localhost:8083/add
),它以post的方式请求接口,并传入name值,把数据保存到db/data.json中去。
使用postman软件进行测试。
post类型与get类型的接口区别较大,主要在两个方面:
req.method
来获取(GET,POST)对于获取post参数就相对复杂一些。它的特点是:
req对象
的两个事件data
,end
。 空容器result
来装参数。req对象
上监听data事件。这个事件触发一次,就把当次收到的数据向result中填充一些。// 实现post接口const http = require('http');const qs = require('querystring')const server = http.createServer((req,res)=>{ if(req.url === '/add' && req.method === "POST"){ // data事件 // 当收到一部分数据之后,就会执行一次回调函数,可能会执行多次 // 并且回调中的参数就是本身收到的这一部分数据(buffer格式) let result = ""; req.on('data',function(rs){ console.log('服务器收到了post的一部分数据:'); console.log(rs); result += rs; // 会自动把buffer转成字符串 }) // end事件 // 服务器接收post参数完毕之后,就会执行回调函数, req.on('end',function(){ console.log('服务器接收post参数完毕'); // 最终得到的是一个查询字符串 a=1&b=2 // 把查询字符串转成对象?使用queryString模块 let obj = qs.parse( result ); // 把值保存到db.json中 }) } else { res.end('error') }})server.listen(8000,()=>{ console.log(8000);})
在发post请求时,传递的数据会在请求体中,它也是字符串格式,并且是一点一点上传到web服务器的(是积小成多,而不是一蹴而就)每上传一部分就会触发data事件,而最后全部上传完成之后,会触发end事件。
下面是一个示例代码,用来模拟使用post请求发送大量的数据,以观察req.on('data', chunk => {})
多次触发的现象。
var xhr =new XMLHttpRequest();xhr.open('post','http://localhost:8080/post');xhr.setRequestHeader('content-type','application/x-www-form-urlencoded');xhr.send("name="+"imissyou".repeat(100000));
转载地址:http://fdca.baihongyu.com/