博客
关于我
nodejs核心模块 http模块 ---接口
阅读量:267 次
发布时间:2019-03-01

本文共 4156 字,大约阅读时间需要 13 分钟。

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.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),而不能是对象

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 和 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');})

16.post接口

目标

提供一个名为add的接口(http://localhost:8083/add),它以post的方式请求接口,并传入name值,把数据保存到db/data.json中去。

使用postman软件进行测试。

预备知识

post类型与get类型的接口区别较大,主要在两个方面:

  1. 类型不同: 可以通过req.method 来获取(GET,POST)
  2. 传参不同
    • get请求参数在请求行中(附加在url后面),内容比较少。
    • post请求参数在请求体中。内容比较大。

对于获取post参数就相对复杂一些。它的特点是:

  1. 参数在请求体中发给后端
  2. 后端是一段一段接收数据的,并不像get在请求行中传递的数据:直接写在url中的查询字符串内,可以立即通过req.url来解析出来。
  3. 在接收参数的过程中,会涉及req对象的两个事件data,end
    • data事件,每次收到一部分参数数据就会触发一次这个事件。
    • end事件,全部的参数数据接收完成之后会执行一次。

基本流程

  1. 定义一个空容器result来装参数。
  2. req对象上监听data事件。这个事件触发一次,就把当次收到的数据向result中填充一些。
  3. 在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));

转载地址:http://fdca.baihongyu.com/

你可能感兴趣的文章
mysql CPU使用率过高的一次处理经历
查看>>
Multisim中555定时器使用技巧
查看>>
MySQL CRUD 数据表基础操作实战
查看>>
multisim变压器反馈式_穿过隔离栅供电:认识隔离式直流/ 直流偏置电源
查看>>
mysql csv import meets charset
查看>>
multivariate_normal TypeError: ufunc ‘add‘ output (typecode ‘O‘) could not be coerced to provided……
查看>>
MySQL DBA 数据库优化策略
查看>>
multi_index_container
查看>>
MySQL DBA 进阶知识详解
查看>>
Mura CMS processAsyncObject SQL注入漏洞复现(CVE-2024-32640)
查看>>
Mysql DBA 高级运维学习之路-DQL语句之select知识讲解
查看>>
mysql deadlock found when trying to get lock暴力解决
查看>>
MuseTalk如何生成高质量视频(使用技巧)
查看>>
mutiplemap 总结
查看>>
MySQL DELETE 表别名问题
查看>>
MySQL Error Handling in Stored Procedures---转载
查看>>
MVC 区域功能
查看>>
MySQL FEDERATED 提示
查看>>
mysql generic安装_MySQL 5.6 Generic Binary安装与配置_MySQL
查看>>
Mysql group by
查看>>