Ajax篇-前后端交互, 接口文档, ajax, axios, fetch,Postman工具

news2025/1/16 3:52:02
    • 前后端交互

    • 接口文档

    • 请求方法

区分方式

GET

POST

从语义上区分

偏向于查询(获取数据....)

偏向于提交数据(注册,修改,删除...)

安全性

显示的携带参数,参数是直接拼接在请求地址之后,安全性较差,隐私性差

隐式的携带参数,不会在请求地址上显示,安全性好,以JSON格式传参

请求数据长度大小是否有限制

有限制,根据浏览器不同,限制在2k-8K

POST请求没有限制

是否被缓存

可以被缓存

不会被缓存

    • 状态码

readyState

status状态

0

请求未初始化

202

“OK”

1

服务器连接已建立

404

表示没有找到页面

2

请求已接收

500

(后台)代码有错误

3

请求处理中

4

请求已完成,且响应已就绪

当 readyState 等于 4 且状态为 200 时,表示响应已就绪

    • 携带参数

例子:

    • 响应数据

格式:JSON格式 {属性名:属性值,属性名2:属性值2.....}

    • Ajax

    • 发起GET请求

      // 前后端交互   GET
      // 1. 创建 XMLHTTPRequest 对象
      const xhr = new XMLHttpRequest()
      // 2. 发送请求配置 open()
      // 参数1: 请求方式get/post...  参数2: 请求地址url  参数3: true(异步)/false(同步)
      // (1) 不携带参数
      // xhr.open('get', 'http://81.70.153.180:8081/api/getStudentList', true)
      // (2) 携带参数  多个之间&分隔
      xhr.open('get', 'http://81.70.153.180:8081/api/getStudentList?sname=王&sid=0001', true)
      // 3. 发送请求 send()
      xhr.send()
      // 4. 接收服务器响应数据 onreadystatechange
      xhr.onreadystatechange = function () {
        //回调函数(状态码发生变化时,执行)
        // 获取服务器给客户端响应的数据(数据格式:JSON格式----->JSON格式的字符串)
        // 将JSON格式的字符串转换成对象  JSON.parse()
        if (xhr.readyState === 4 && xhr.status === 200) {
          const result = JSON.parse(xhr.responseText)
          console.log(result)
        }
      }
    • 发起POST请求

// 前后端交互  POST
      // 1. 创建 XMLHTTPRequest 对象
      const xhr = new XMLHttpRequest() 

      // 2. 发送请求配置 open()
      // 参数1: 请求方式get/post...  参数2: 请求地址url  参数3: true(异步)/false(同步)
      xhr.open('post', 'http://81.70.153.180:8081/api/login', true)

      // 3.设置 Content-Type 属性(固定写法)
      // xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
      // 4. 发送请求 send()   同时将数据以查询字符串的形式,提交给服务器
      // xhr.send('sid=s0001&password=123456')

      // 3.设置 Content-Type 属性  JSON格式  charset=UTF-8避免中文乱码
      xhr.setRequestHeader('Content-Type','application/json;charset=UTF-8');
      // 4. 发送请求
      xhr.send(JSON.stringify({'sid':'s0001','password':'123456'}))

      // 5. 接收服务器响应数据 onreadystatechange
      xhr.onreadystatechange = function () {
        //回调函数(状态码发生变化时,执行)
        // 获取服务器给客户端响应的数据(数据格式:JSON格式----->JSON格式的字符串)
        // 将JSON格式的字符串转换成对象  JSON.parse()
        if (xhr.readyState === 4 && xhr.status === 200) {
          const result = JSON.parse(xhr.responseText)
          console.log(result)
        }
      }
    • axios

    • 发起GET请求

  <script src="https://unpkg.com/axios/dist/axios.min.js"></script>  //引入axios
      //  1. 引入Axios (npm安装 / cdn引入)
      // axios返回Promise对象, 需要.then(回调函数)来处理
      //  2. 发起get请求
      // 方式1
      axios.get('http://81.70.153.180:8081/api/getStudentList', {
          params: { sid: 's0001', sname: '王' }
        }).then((res) => {
          console.log(res.data)
        })
      // 方式2
      axios.get("http://81.70.153.180:8081/api/getStudentList?sid=s0001&sname=王")
        .then(res=>{
        console.log(res);
        })
    • 发起POST请求

      //  发送post请求    引入后
      axios.post('http://81.70.153.180:8081/api/login', {
          sid: 's0001',
          password: '123456',
        }).then((res) => {
          console.log(res)
      })

      axios({
        url: 'http://81.70.153.180:8081/api/login',  //请求地址
        method: 'post',     //请求方式 
        headers: { ' Content-Type' : 'applicaton/json;charset=utf-8'},   //设置请求头(可选)
        data:{        //携带参数     get请求传参使用params
          sid: 's0001',
          password: '123456',
        },
      }).then(res=>{     //接收返回的结果
        console.log(res);
      })

注意: 使用axios发送请求携带参数时, get请求携参使用params, post请求携参使用data

    • fetch

      // js原生发送请求 fetch
      // 发送get请求
      fetch('http://81.70.153.180:8081/api/getStudentList', {
        method: 'get', //默认get
      }).then((res) => {
          //返回的结果处理   返回的是Promise对象
          if (res.ok) {
            //如果请求成功, 将结果转为JSON格式
            return res.json()
          }
        }).then((data) => {
          console.log(data)
        })
      // 发送post请求
      fetch('http://81.70.153.180:8081/api/login', {
        method: 'post',
        headers: { ' Content-Type': 'applicaton/json;charset=utf-8' },
        body: JSON.stringify({
          //转换为JSON字符串
          sid: 's0001',
          password: '123456',
        }),
      }).then((res) => {
          //返回的结果处理   返回的是Promise对象
          if (res.ok) {
            //如果请求成功, 将结果转为JSON格式
            return res.json()
          }
        }).then((data) => {
          console.log(data)
        })
    • Postman工具

    • 一个例子

一个简单的例子, 对发送get/post请求的简单使用

  1. 登录验证

  1. 验证通过后跳转到查询页面

  1. 可根据id/姓名信息查找相关数据, 可重置

相关代码如下:

<!-- login.html -->
<!DOCTYPE html>
<html lang="en">
    <head>
        <title>login</title>
        <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
        <style type="text/css">
            * {
                margin: 0;
                padding: 0;
            }
            div.box {
                margin: 10% auto;
                padding: 40px;
                width: 30%;
                height: 30%;
                text-align: center;
                background-color: rgb(251, 236, 236);
            }
            div.box form ul li {
                position: relative;
                list-style: none;
                margin-top: 40px;
                font-size: 20px;
            }
            div.box form ul li input {
                padding-left: 10px;
                width: 50%;
                height: 30px;
                outline: 0;
            }
            div.box form ul li button {
                width: 67%;
                height: 40px;
                border: 0;
                font-size: 20px;
                background-color: rgb(248, 217, 217);
            }
            div.box form ul li p {
                position: absolute;
                left: 32%;
                top: 43px;
                font-size: 14px;
                display: none;
            }
        </style>
    </head>
    <body>
        <!-- 登录案例 -->
        <div class="box">
            <!-- action地址  onsubmit提交方式  javascript:void(0)阻止跳转 -->
            <form action="#" onsubmit="javascript:void(0)">
                <h2>小m的登录耶</h2>
                <ul>
                    <li class="uname">
                        <label for="uname">用户id :</label>
                        <input type="text" id="uname" placeholder="请输入用户名" />
                        <p>用户名不能为空!</p>
                    </li>
                    <li class="psd">
                        <label for="psd">密 &nbsp; 码 :</label>
                        <input type="text" id="psd" placeholder="请输入密码" />
                        <p>密码不能为空!</p>
                    </li>
                    <li>
                        <button>登 &nbsp; 录</button>
                    </li>
                </ul>
            </form>
            <span style="margin-top: 10px;"></span>
        </div>
        <script>
            // 1. 获取button按钮
            const btn = document.querySelector('button')
            // 2. 添加监听事件 对用户名和密码进行校验
            btn.addEventListener('click', function(e) {
                // 阻止按钮默认行为
                e.preventDefault()
                // 获取用户名和密码文本内容, 并去除前后端空格
                const uname = document.querySelector('input#uname').value.trim()
                const psd = document.querySelector('input#psd').value.trim()
                const unameTip = document.querySelector('ul li.uname p')
                const psdTip = document.querySelector('ul li.psd p')
                unameTip.style.display = 'none'
                psdTip.style.display = 'none'
                // 输入内容为空时, 显示提示信息
                if (uname === '' || uname.length === 0) {
                    unameTip.style.display = 'block'
                    return
                }
                if (psd === '' || psd.length === 0) {
                    psdTip.style.display = 'block'
                    return
                }
                // 登录操作
                axios({
                    url: 'http://81.70.153.180:8081/api/login',
                    method: 'post',
                    data: {
                        sid: uname,
                        password: psd
                    }
                }).then(res => {
                    // console.log(res)
                    // console.log(res.data.message)
                    if (res.data.message.indexOf('错误') > -1) { // 使用code进行判断,code == 0,就是用户名或密码错误,  (由于后台问题这样使用,一般不会这样使用)
                        const h = document.querySelector('span')
                        h.innerHTML = res.data.message
                        h.style.display = 'block'
                    } else {
                        // 登录成功,转到首页。
                        window.location.href = './02-index.html';html'
                    }
                })
            })
        </script>
    </body>
</html>
<!-- index.html -->
<!DOCTYPE html>
<html lang="en">
    <head>
        <title>index首页</title>
        <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
        <style type="text/css">
            * {
                margin: 0;
                padding: 0;
            }
            div.box {
                margin: 100px auto;
                padding: 20px;
                width: 50%;
                /* height: 80px; */
                text-align: center;
                background-color: rgb(245, 211, 211);
            }
            div.box div.search {
                margin-top: 20px;
                font-size: 20px;
            }
            div.box div.search input {
                padding-left: 10px;
                width: 50%;
                height: 30px;
                outline: 0;
            }
            div.box div.search button {
                width: 10%;
                height: 34px;
                border: 0;
                font-size: 18px;
                background-color: #ffb2b3;
            }
            div.box table {
                margin-top: 30px;
                width: 100%;
            }
            div.box table thead {
                font-size: 20px;
            }
            div.box table td {
                width: 20%;
                height: 40px;
            }
        </style>
    </head>
    <body>
        <div class="box">
            <h2>登录成功</h2>
            <div class="search">
                按照ID/姓名: <input type="text" placeholder="请输入要搜索的内容" />
                <button onclick="search()">搜索</button>
                <button onclick="init()">重置</button>
            </div>
            <table border="1px" cellspacing="0" cellpadding="0">
                <thead>
                    <td>学号</td>
                    <td>姓名</td>
                    <td>性别</td>
                    <td>电话</td>
                    <td>地址</td>
                </thead>
                <tbody></tbody>
            </table>
        </div>
        <script>
            // 渲染数据
            // 1. 获取元素
            const tbody = document.querySelector('div table tbody')

            window.onload = function() {
                Stu()
            }

            function Stu(val, flag) {
                tbody.innerHTML = '';
                if (flag) {
                    params = {sid: val}
                } else {
                    params = {sname: val}
                }

                // 2. 获取相应的数据
                axios({
                    url: 'http://81.70.153.180:8081/api/getStudentList',
                    method: 'get',
                    params: params
                }).then(res => {
                    console.log(res);
                    // 获取到学生信息
                    const students = res.data.data
                    console.log(students)
                    // 将数据渲染到页面
                    // 如果没有相关数据 显示nodata
                    if (students.length === 0) {
                        // 创建元素
                        const tr = document.createElement('tr')
                        const td = document.createElement('td')
                        // 设置属性, 合并单元格
                        td.setAttribute('colspan', 4)
                        td.innerText = 'No Data !'
                        tr.appendChild(td)
                        tbody.appendChild(tr)
                    } else {
                        // 遍历students数组
                        students.forEach(stu => {
                            // console.log(stu);
                            const {sid,sname,sex,phone,address} = stu
                            // 数组存放解构的内容
                            const arr = [sid, sname, sex, phone, address]
                            // console.log(arr);
                            const tr = document.createElement('tr')
                            // 遍历数组, 将每一项内容添加至表格中  
                            arr.forEach((item, index) => {
                                const td = document.createElement('td');
                                td.innerText = item
                                if (index === 2) {
                                    td.innerText = sex == 0 ? '女' : '男';
                                }
                                tr.appendChild(td)
                            })
                            tbody.appendChild(tr);

                            // 一个一个的添加 
                            // const sidTd = document.createElement('td');
                            // sidTd.innerText = sid;
                            // tr.appendChild(sidTd);
                            // const snameTd = document.createElement('td');
                            // snameTd.innerText = sname;
                            // tr.appendChild(snameTd);
                            // const sexTd = document.createElement('td');
                            // sexTd.innerText = sex == 0 ? '女' : '男';
                            // tr.appendChild(sexTd);
                            // const phoneTd = document.createElement('td');
                            // phoneTd.innerText = phone;
                            // tr.appendChild(phoneTd);
                            // 将tr作为tbody的孩子
                            // tbody.appendChild(tr);
                        })
                    }
                })
            }

            //搜索
            function search() {
                // 获取搜索框的内容
                const val = document.querySelector('div.search input').value.trim()
                if (val === '' || val.length === 0) {
                    alert('搜索内容为空!!!')
                    return;
                }
                let regExp = /^\w+$/g //  \w单词字符 单词字母下划线 +一次或多次
                // 满足 则是id
                let flag = regExp.test(val)
                Stu(val, flag)
            }
            
            // 重置
            function init(){
                Stu()
                // 清空输入框内容
                const ipt = document.querySelector('div.search input')
                ipt.value = ''
            }
        </script>
    </body>
</html>
自己做的一点小改变:
1. index.html中渲染数据时, 将解构出来的数据放在数组中, 在遍历数组,动态的将数据添加至页面, 避免了数据过多, 写很多的创建节点的代码
2. 其实也是偷了个懒, 把id搜索功能和姓名搜索功能写在了一起, 使用正则判断了一下文本输入的是id(单词字符)还是名字,动态的将数据给params携带参数, 发送请求, 实现既可以使用id,又可以使用姓名搜索相关内容
3. 实现了重置功能, 其实就是点击重置按钮, 使得文本框内容为空, 并且页面显示最初的所有数据

PreviousNotes:

https://blog.csdn.net/qq_54379580/article/details/126582952?spm=1001.2014.3001.5502

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/148847.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

网络虚拟化基本架构

文章目录架构概述架构图核心组件OpenFlow SwitchPipelineFlow Table EntryInstructionOpenFlow Switch Protocol测试验证Pipeline流表项间流程流表间流程Flow Table EntryInstructionsSwitch ProtocolFaucet架构概述 我们知道网络虚拟化的主要目标就是让报文可以在虚拟机之间进…

Windows Anaconda YOLOv3环境部署--2023年1月8日

时效性&#xff1a; 2023年1月8日 目录摘要1 使用 Anaconda 创建虚拟环境2 安装官方要求的依赖库3 验证安装 | 执行 detect.py 示例代码Key already registered with the same priority摘要 网好的可以直接参考官方文档安装&#xff0c;遇到安装报错和网络问题可以参考本文 本地…

网络安全等级保护定级指南 范围

声明 本文是学习github5.com 网站的报告而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 网络安全等级保护 为了配合《中华人民共和国网络安全法》的实施&#xff0c;适应云计算、移动互联、物联网、工业控制和大数据等新技术、新应用情况下网络安全等…

Spring Cloud OpenFeign入门示例

简介 Feign Feign是一个声明性web服务客户端。让编写Web服务客户端变得非常容易&#xff0c;只需创建一个接口并在接口上添加注解即可。让http远程调用就像接口调用一样简单。&#xff08;远程http调用的工具有很多&#xff0c;HttpClient、OKHttp、Spring Boot中的RestTempl…

2023新年红包,兔年HTML红包页面代码【2023新年快乐_附源码】

文章目录一.新年红包&#xff0c;兔年HTML红包页面1.1 资源获取和效果预览二.代码讲解&#xff08;Html文件&#xff09;三.Html文件代码展示&#xff08;需要全部源码请到文章开头链接处下载&#xff09;一.新年红包&#xff0c;兔年HTML红包页面 1.1 资源获取和效果预览 1.…

【Nacos】- Mac-M1下Nacos安装及Nacos启动报错“have ‘x86_64’,need ‘arm64e‘”

Nacos安装及Nacos启动报错“have ‘x86_64’,need arm64e”nacos下载启动nacos问题描述解决方案1、下载安装x86架构的jdk2、更换nacos版本&#xff1a;我这是更换为1.4.2的nacos下载 下载地址&#xff1a;https://github.com/alibaba/nacos/releases 根据自己的工具及需要版本…

LINUX 动态库的版本控制

Linux库文件名的描述版本信息library filename lib <libaray name> .so <libarary version information>库版本信息通常使用以下格式&#xff1a;dynamic libarary version information <M>.<m>.<p>其中&#xff0c;M用一位或多位数字表示库…

(九)汇编语言——转义指令的原理

&#xff08;九&#xff09;汇编语言——转移指令的原理 文章目录&#xff08;九&#xff09;汇编语言——转移指令的原理转移指令作用分类转移行为转移距离转移指令操作符offsetjmp指令功能原理段间转移段内转移短转移原理长转移原理位移越界转移地址寄存器内存段内转移段间转…

【Linux基础】Linux中的时区和时间

基本概念 首先介绍Linux中会用到的时间概念&#xff1a; UTC&#xff1a;Universal Time Coordinated&#xff0c;协调世界时&#xff0c;又称世界统一时间&#xff0c;世界标准时间&#xff0c;国际协调时间。它是一个与时区相关的时间&#xff0c;目前将世界时区分为24个。…

【练习】Day04(未完成版)

努力经营当下&#xff0c;直至未来明朗&#xff01; 文章目录一、选择二、编程1. 数组中的第K个最大元素2. 组合总数III答案1. 选择2. 编程普通小孩也要热爱生活&#xff01; 一、选择 下面代码运行结果是&#xff08; &#xff09; public class Test{public int add(int a…

传统图像特征描述及提取方法

图像特征描述 图像特征是一幅图像区别于另一幅图像的最基本特征&#xff0c;是其可以作为欸标志性的属性。 图像特征分为两大类: 自然特征&#xff1a;图像本身都具有内在的图像特征&#xff08;如图像的大小、颜色、轮廓、边缘、纹理等&#xff09; 人为特征&#xff1a;便于…

【Linux】基础 IO

文章目录一、文件相关基础知识二、文件操作1、语言层面的文件操作与操作系统层面的文件操作的关系2、C语言文件操作3、操作系统文件操作3.1 比特位传递选项3.2 文件相关系统调用3.3 文件操作接口的使用三、文件描述符1、什么是文件描述符2、文件描述符的分配规则四、重定向1、什…

Docker三剑客——Docker Compose

目录 一、概述 二、Docker Compose工作流程 三、安装Docker Compose 四、Docker Compose管理命令 &#xff08;1&#xff09;docker-compose build &#xff08;2&#xff09;docker-compose kill &#xff08;3&#xff09;docker-compose logs &#xff08;4&#xff…

unity 实现千人同屏

作为开发人员&#xff0c;我们总是关注性能&#xff0c;包括CPU和GPU。随着场景变得越来越大越来越复杂&#xff0c;保持良好的性能变得越来越有挑战性&#xff0c;尤其是当我们添加越来越多的角色时。我和我在上海的同事在帮助客户时经常遇到这个问题&#xff0c;所以我们决定…

springcloud-gateway

网关zuul&#xff1a; https://github.com/Netflix/zuul/wiki Spring Cloud 网关gateway&#xff1a;Spring Cloud Gateway Spring Cloud Gateway Cloud全家桶中有个很重要的组件就是网关&#xff0c;在1.x版本中都是采用的Zuul网关; 但在2.x版本中&#xff0c;zuul的升级—…

【韩顺平Linux】学习笔记4

【韩顺平Linux】学习笔记4一、Linux组的介绍1.1文件/目录所有者1.2 组的创建1.3 其它组1.4 权限的基本介绍1.5 权限说明案例1.6 修改权限-chmod1.7 修改文件/目录所有者-chown/-chgrp二、crond任务调度三、at定时任务一、Linux组的介绍 在Linux中&#xff0c;每个用户都属于一个…

AtCoder Beginner Contest 284.(A--E)

AtCoder Beginner Contest 284A - Sequence of Strings1、问题2、代码B - Multi Test Cases1、问题2、代码C - Count Connected Components1、问题&#xff1a;2、思路&#xff1a;——并查集、DFS3、代码方法1&#xff1a;并查集方法2&#xff1a;DFSD - Happy New Year 20231…

Linux内核学习笔记——内核页表隔离KPTI机制(源码分析)

KPTI(Kernel PageTable Isolation)全称内核页表隔离&#xff0c;它通过完全分离用户空间与内核空间页表来解决页表泄露。 KPTI中每个进程有两套页表——内核态页表与用户态页表(两个地址空间)。 内核态页表只能在内核态下访问&#xff0c;可以创建到内核和用户的映射&#xf…

单体的 TienChin 和微服务的 TienChin 有何异同?

有不少小伙伴希望松哥能整一个微服务的实战项目&#xff0c;微服务这块技术点其实松哥是讲过很多了&#xff0c;图文版的教程视频版的教程都有&#xff0c;不过确实缺乏一个项目&#xff0c;所以我在想等 TienChin 项目搞完之后&#xff0c;和小伙伴们也来一起搞一个微服务的项…

nacos2.0客户端注册流程分析

版本介绍 copy几个jar包出来康康把 spring-cloud-starter-alibaba-nacos-config-2021.0.4.0.jar spring-cloud-starter-alibaba-nacos-discovery-2021.0.4.0.jar nacos-client-2.0.4.jar 注册流程 读取Spring Boot装载配置文件 spring.factories&#xff0c;找到启动类 Nac…