• 前后端数据传输的两者方法——GET和POST


    GET

    在原生AJAX网络请求中,xhr对象的open方法配置信息,就已经接触过了“GET”,今天来好好解释一下它的用法。

    GET请求可以传递信息给服务器后端,将要传递的参数放在网址的querystring字段,egg框架的后端用ctx.request.query获取。

    在传输的过程中传递的信息在请求数据包的头部,我们在浏览器的地址栏就可以看到我们传递的信息,因此它非常的不安全,不适合用于账号密码之内的传输,但是它的传输速度快,大部分的网络传输都是采用的GET请求。

    GET在axios中的使用(主流)

    传递参数有两种写法:1、直接写在网址的querystring字段中   2、axios()方法的第二个参数也可以拿来传递参数,如{params:{a:1,b:2}},在代码运行时,这个参数对象会被拆分拼接到网址上,是这个团队为方便我们封装的技术。

    写个代码简单的实现一下前后端的信息交互:

    静态页面:

    1. <h1>我来了egg框架h1>
    2. <input type="text" id="me">
    3. <button>GET方法传递消息button>
    4. <script>
    5. var btn=document.querySelector("button")
    6. btn.onclick=function(){
    7. var intv=document.querySelector("input").value
    8. //写法1
    9. //var url=`/ajax?key1=${intv}`
    10. //axios(url)
    11. //.then(res=>console.log(res))
    12. //写法2
    13. var url="/ajax"
    14. axios(url,{params:{key1:intv}})
    15. .then(res=>console.log(res))
    16. }
    17. script>

    在路由文件中注册一个数据接口:

    1. module.exports = app => {
    2. const { router, controller } = app;
    3. router.get("/ajax",controller.home.ajax)
    4. };

    在home.js中获取传递信息:

    1. class HomeController extends Controller {
    2. async ajax() {
    3. const { ctx } = this;//解构赋值
    4. var que=ctx.request.query
    5. ctx.body = que;
    6. }
    7. }

    开启服务器,在页面点击按钮获取一下信息:

     可以看到后端通过request.query获取到了传递的信息,并通过ctx.body传回给了前端。

    除了利用AJAX或者封装的AJAX网络请求工具外,浏览器、a标签、img标签的src属性、link标签的href属性、form标签的action属性都能够做网络请求。

    浏览器

    浏览器的地址栏只能做GET网络请求 ,它会将接收到的数据直接渲染到浏览器页面,如果解析失败会下载。

    借上面的服务器,我们直接在浏览器输入ajax接口的网址,并顺便写一个querystring字段。

     当请求的页面无法正常解析时,如我们请求的是一个压缩包,在public文件夹下创建a.rar:

    a标签

    a标签的src属性也是只能做GET请求,当我们点击这个标签时就会发送网络请求给href的网址,后端返回的数据,接受的数据会直接读取渲染,如果解析失败会下载。跟浏览器地址栏网络请求相似就不做演示了。

    img标签

    img标签的src属性,也是只能发get请求  返回的数据渲染成图片 如果非图片编码就会"碎裂"

    link标签

    link标签的href属性,也是只能发get请求 返回的数据按照功能使用,浏览器将获取到的css文件,形成css样式结构体渲染页面。 

    form标签

    form标签的action属性 支持GET和POST请求,用户点击了提交按钮或者触发表单的提交事件

    GET请求会把form中的数据全部解析为url的querystring。

    这里只讲get请求,写一个例子具体说明:

    将index.html修改为:

    1. <button>GET方法传递消息button> -->
    2. <form action="/ajax" method="get">
    3. <input type="text" name="uesrname" id="user">
    4. <input type="text" name="password" id="pwd">
    5. <input type="submit" value="提交">
    6. form>

    点击提交后:

     跟a标签一样,后端返回的数据,直接渲染到页面上。

    我们在在框内输入的是zhangsan和18,它的querystring字段uesrname=zhangsan&password=18

    即就是把form中的数据全部解析为url的querystring,input标签的name为key值,input标签的value

    为value值。

    我也可以在终端打印看到解析好的querystring对象:

    POST

    post传递参数会将参数转为暗文,适合传输隐私数据和大量数据的情况,在传输的过程中传递的信息在请求数据包的请求体中。

    我们要在egg框架中测试Post,要先在config.default.js文件内关闭安全验证:

    添加下面代码:

    1. config.security={
    2. csrf:{
    3. enable:false
    4. }
    5. }

    post数据默认大小是100kb,我们也可以在config.default.js 中覆盖框架的默认值:

    1. module.exports = {
    2. bodyParser: {
    3. jsonLimit: '1mb',
    4. formLimit: '1mb',
    5. }
    6. };

    POST发送数据的两种方法:

    1、 axios.post(url,{参数字段})

    2、

    1. var fdata=new FormData()
    2. fdata.append("key1","value1字段")
    3. fdata.append("key2","value2字段")
    4. fdata.append("key3","value文件1")
    5. fdata.append("key4","value文件2")//最多9个文件
    6. //value文件是指input节点的files属性中的文件对象
    7. axios.post(url,fdata)

    与get不同的是,egg后端接收POST字段和文件不再用ctx.request.query;

    而是字段用:ctx.request.body

    文件用:ctx.request.files

  • 相关阅读:
    享搭低代码平台:加速企业应用开发,轻松搭建表单和报表
    G1回收器的适用场景
    微信支付-前后端分离
    创造建材数字转型新视界,中建材如何多边赋能集团业务快速发展
    飞控常见问题汇总
    jenkins项目构建类型 -----Pipeline流水线项目构建
    第十七次CCF计算机软件能力认证
    【嵌入式软件开发岗位 ---- 面试总结01】
    MySQL (2)
    318. 最大单词长度乘积
  • 原文地址:https://blog.csdn.net/m0_59345890/article/details/126165179