模块 http模块 ---接口"/>
nodejs核心模块 http模块 ---接口
nodejs核心模块 http模块 —接口
13.理解静态资源与接口的区别
服务器上有很多的资源,每个资源都有自己的url。客户端浏览器想要访问某个资源就要向服务器发起对应的请求。
13.1资源的分类
- 静态资源
- 它们一般表现为一个一个的文件。例如
index.html, style.css, index.js
。 - 处理请求静态资源时,服务器一般就直接读出资源的内容,再返回给客户端浏览器
- 它们一般表现为一个一个的文件。例如
- 动态资源:
接口
- 它们不是以某个具体的文件存在的,而是
服务器上的一段代码
,访问接口时,服务器会执行这段代码,然后把代码的执行结果返回给客户端浏览器。
- 它们不是以某个具体的文件存在的,而是
13.2发送请求的途径
- 在地址栏中直接访问这个url
- 通过某个a标签进行进行跳转
- 通过表单进行提交
- 通过ajax技术访问这个url。
13.3发送请求的类型
- get:在地址栏中直接访问这个url就是get方式。对于静态资源,我们通过的处理方式就是get请求。
- post: 通过表单提交,可以设置form的method为post
- delete
- put
- patch
- options
- …
14.写一个不带任何参数的get类型接口
目标
提供一个名为getList的接口(http://localhost:8083/getList
),它以json字符串格式返回db/data.json的内容。
使用postman软件进行测试。
目录结构
|-db
|---data.json # 数据
|-server.js # 你的代码
参考代码
// server.js
const 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
),而不能是对象
15.带参数的get请求-获取查询字符串中的数据
目标
提供一个名为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 和 queryStrlet qsObj = qs.parse(queryStr); //使用核心模块querystring 分割查询字符串let filePath = path.join(__dirname, 'db', 'data.json'); //拼接一个data.json的绝对路径if (url === '/getList' && req.method === 'GET') { //如果请求的路径是/getList 请求类型是getlet arr = JSON.parse(fs.readFileSync(filePath)); //拿到data.json的内容 解析成数组let rs = arr.find(item => { //对数组进行查找 如果找到返回ture 没有找到返回falseif (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');
})
16.post接口
目标
提供一个名为add的接口(http://localhost:8083/add
),它以post的方式请求接口,并传入name值,把数据保存到db/data.json中去。
使用postman软件进行测试。
预备知识
post类型与get类型的接口区别较大,主要在两个方面:
- 类型不同: 可以通过
req.method
来获取(GET,POST) - 传参不同
- get请求参数在请求行中(附加在url后面),内容比较少。
- post请求参数在请求体中。内容比较大。
对于获取post参数就相对复杂一些。它的特点是:
- 参数在请求体中发给后端
- 后端是一段一段接收数据的,并不像get在请求行中传递的数据:直接写在url中的查询字符串内,可以立即通过req.url来解析出来。
- 在接收参数的过程中,会涉及
req对象
的两个事件data
,end
。- data事件,每次收到一部分参数数据就会触发一次这个事件。
- end事件,全部的参数数据接收完成之后会执行一次。
基本流程
- 定义一个
空容器result
来装参数。 - 在
req对象
上监听data事件。这个事件触发一次,就把当次收到的数据向result中填充一些。 - 在req对象上监听end事件。这个事件触发时,就表示整个参数数据接收完成,此时取出容器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));
更多推荐
nodejs核心模块 http模块 ---接口
发布评论