AJAX —— 学习(三)

news2024/11/23 19:19:26

目录

一、jQuery 中的 AJAX

(一)get 方法

1.语法介绍

2.结果实现

(二)post 方法

1.语法介绍

2.结果实现 

(三)通用型的 AJAX 方法

1.语法介绍

2.结果实现  

二、AJAX 工具库 axios

(一)介绍

(二)axios 发送 AJAX 请求

1.基本语法

2.get 方法

语法

3.post 方法

语法

4.axios 发送 AJAX 请求优点

(三)axios 函数发送 AJAX 请求

1.语法

三、使用 fetch() 函数发送 ajax 请求

四、跨域

(一)同源策略

1.介绍

2.代码例子

(二)跨域

(三)解决跨域

1.JSONP 请求

介绍

如何工作

 2.原生 JSONP 实现

未完待续。。。就差一点了。。。这个有点复杂qaq


一、jQuery 中的 AJAX

要先去bootCDN网站中引入 jQuery

(一)get 方法

1.语法介绍

语法如下,括号里面有三个参数

第一参数:向谁发请求

第二参数:发送什么参数 是一个对象类型

第三参数:回调函数内部是响应体 data 参数是接收到的响应体,在回调函数中可以对响应体 data 做一些操作

第四参数:响应体类型通常用 ‘json’ 可以将 json 字符串进行解析 变回原来类型

 $('button').eq(0).click(function () {
      $.get('http://127.0.0.1:8000/jquery-server', { a:100, b:200 }, function (data) {
        console.log(data)
      },'json')
    })
2.结果实现

用 json 返回数组 不用返回字符串

a, b参数成功发过去了,响应体也正确

控制台输出也正确,可能有警告,在引入的javascript 标签加上一个属性就行 匿名的意思crossorigin="anonymous"

<script crossorigin="anonymous" src="https://cdn.bootcdn.net/ajax/libs/jquery/3.5.1/jquery.js"></script>

(二)post 方法

1.语法介绍

参数看 get 方法

改成 post 就行 换成第二个按钮 eq(1) 其它都一样

但是查看请求体内容和 get 方法不一样,post 不会直接显示到 url 后面,而是显示到请求字符串中

 $('button').eq(1).click(function () {
        $.post('http://127.0.0.1:8000/jquery-server', { a: 100, b: 200 }, function (data) {
          console.log(data)
        })
      },'json')
2.结果实现 

(三)通用型的 AJAX 方法

1.语法介绍

和前两个方法不同,AJAX方法 参数是对象,而且 使用这个方法可以对 http 报文内部的很多属性进行修改,功能性比较强。

能进行定义的六个属性两个方法

第一属性 url:url 请求的对象

第二属性 data:发送的请求体内容 也是对象

第三属性 type:以什么方法发送 GET 类型 还是 POST 类型

第四属性 dataType:响应体结果设置 ‘json’ 类型

第五属性 timeout:设置超时时间

第六属性 header:设置自定义请求头,如果报错看之前笔记,有处理方法,是对象形式

方法一 success:回调函数 如果请求成功 成功可以对返回的响应体内容进行处理

方法二 error:回调函数 如果请求超时 就返回一个提示

 $('button').eq(2).click(function () {
      $.ajax({
        //url
        url: 'http://127.0.0.1:8000/jquery-server',
        //参数
        data: { a: 100, b: 200 },
        // 请求类型
        type: 'GET',
        // 响应体结果
        dataType: 'json',
        // 成功的回调函数
        success: function (data) {
          console.log(data)
        },
        // 超时时间
        timeout:2000,
        // 失败的时间
        error: function(){
          console.log('出错!')
        },
        // 设置自定义请求头
        header: {
          c:100,
          d:100
        }
      })
    })
2.结果实现  

查看结果:结果正确

设置延时后:

二、AJAX 工具库 axios

(一)介绍

前端热门的 AJAX 工具库,用来发送 AJAX 请求

要先去bootCDN网站中引入 axios

(二)axios 发送 AJAX 请求

比如:我们可以使用这个工具库 把 url 地址单独写出来

    axios.defaults.baseURL = 'http://127.0.0.1:8000'

然后下面就不用写了,但是得写后面的 /axios-server

1.基本语法

axios.请求方法名( url地址后面部分,{里面是发送的一些参数值,可以自己设置

params:{

这里是 url 后面的传入的参数值

}

headers:{

自定义请求头

}

}).then(value => {这里面处理服务器返回的响应体(这里使用了es6 promise 语法)

console.log(value)这里的 value 是对象 里面有很多属性 包括返回来的响应体 data 能自动转换成对象

})

2.get 方法
语法

get 方法没有请求体内容 所以就按基本语法来就行

<script>
    const btns = document.querySelectorAll('button')
    axios.defaults.baseURL = 'http://127.0.0.1:8000'
    btns[0].onclick = function () {
      axios.get('/axios-server', {
        params: {
          id: 100,
          vip: 100
        },
        headers: {
          name: 'haha',
          age: 18
        }
      }).then(value => {
        console.log(value)
      })
    }
  </script>

3.post 方法

相比于 get 方法 还可以设置 请求体 的内容 在下面 data 部分书写

行,头,体 结构很清晰 

注意结构 post 因为有响应体结构,响应体内容作为第二个参数传入进去

格式是这样的

语法

 axios.post(url地址,响应体内容,(其它内容)).then((value)=> {

处理响应体内容 value(是一个对象里面包括响应体)

})

  btns[1].onclick = function () {
      axios.post('/axios-server', {
        username: 'admin',
        password: 'admin'
      }, {
        params: {
          id: 100,
          vip: 100
        },
        headers: {
          name: 'haha',
          age: 18
        }
      }).then(value => {
        console.log(value)
      })
    }

结果成功返回

4.axios 发送 AJAX 请求优点

数据获取完整 value 里面有很多信息

包含 data 返回的响应体 而且是直接解析后的结果 (比如自动解析成对象)

头信息

请求的原生 ajax 对象

相应的状态码

和响应状态字符串

(三)axios 函数发送 AJAX 请求

1.语法

很简单很贴合 http 报文的格式

在 axios 里面直接写一个对象

axios({

method:’发送方法‘,

url:目标地址,

params:{

url 后缀参数

},

headers:{

自定义请求头

},

data:{

请求体

}

}).then(response=>{

返回内容 还是一个对象

内容很多可以挨个调用里面的参数使用 且都是解析好的

})

用自己的方法(一个函数来发送)

 btns[2].onclick = function () {
      axios({
        method: 'post',
        url: '/axios-server',
        params: {
          vip: 10,
          level: 30
        },
        headers: {
          a: 100,
          b: 200
        },
        data: {
          username: 'admin',
          password: 'admin'
        }
      }).then(response => {
        console.log(123)
      })
    }

 response对象中的具体内容:

状态码,响应状态字符串,响应头信息,响应体

可以用下面语句进行检查调用

结果正确

三、使用 fetch() 函数发送 ajax 请求

fetch() 属于全局变量,可以直接调用,不用去外部引用

有两个参数

一个参数是 url

另一个参数是一个对象

可以配置method发送方法 headers请求头 body请求体

返回的结果是一个 promise 对象 response 不能直接使用而是 先return response.text()

再使用一个then 方法 里面就能使用 响应体了

如果响应体是 json 字符串型 我们直接 把上面的 text() 变成 json() 就能把 json 自负床解析成正常的数据类型了

  btn.onclick = function () {
      fetch('http://127.0.0.1:8000/fetch-server', {
        method: 'post',
        headers: {
          name: 'hahah'
        },
        body: 'username=admin&password=admin'
      }).then(response => {
        return response.json()
      }).then(response => {
        console.log(response)
      })
    }

四、跨域

(一)同源策略

1.介绍

同一个来源,浏览器的一种安全机制

当前网页的 url 和 AJAX 请求目标资源 (服务器)的url 必须相同

就是 url(协议、域名、端口)必须完全相同 就 满足同源策略

AJAX 默认遵顼同源策略,如果不满足发不了 AJAX 请求

2.代码例子

如果 a.com 向 b.com 发送请求 就不属于同源

下面这个例子 页面和用户数据资源都是从 9000端口来的 属于同源,可以直接发送 ajax 请求

就是使用同一个服务

这时我们可以省略 url 前面的部分 只写 ‘/data’

<body>
  <h1>哈哈</h1>
  <button>点击获取用户数据</button>
  <script>
    const btn = document.querySelector('button')
    btn.onclick = function () {
      const x = new XMLHttpRequest();
      x.open('get', '/data')
      x.send()
      x.onreadystatechange = function () {
        if (x.readyState === 4) {
          if (x.status >= 200 & x.status < 300) {
            console.log(x.response)
          }
        }
      }
    }
  </script>
</body>

(二)跨域

违背同源策略就是跨域

a.com 向 b.com 发送请求

3000 端口 向 8000 端口发请求

http 协议向 https 协议发送请求

上面都属于跨域

跨域很常见 因为一台服务器不够我们使用 ,我们得添加多台主机服务器使用,有利于资源的划分,向不用服务器发送请求就会发生跨域

(三)解决跨域

外部引入的资源协议 域名 端口 都不一样,是一个跨域请求

  <script crossorigin="anonymous" src="https://cdn.bootcdn.net/ajax/libs/axios/0.19.2/axios.js"></script>
1.JSONP 请求
介绍

JSONP 全称是 JSON with Padding 是非官方的跨域解决方案,只支持 get 请求

如何工作

借助 javascript 工作的

script 标签本身就具有跨域特性

通过返回一个函数调用,函数的实参就是我们想返回给客户端的数据

函数得提前声明,否则报错

让 js 进行解析就是 JSONP 的工作方法

 2.原生 JSONP 实现

借助script 向服务器发送一个请求,服务器返回一个 handle 函数的调用 浏览器收到后一看能执行就进行解析和调用,数据就处理了,实现了跨域

客户端:

<body>
  用户名:<input type="text" id="username">
  <p></p>
  <script>
    const p = document.querySelector('p')
    const input = document.querySelector('input')
    function handle(data) {
      input.style.border = 'solid 1px #f00'
      p.innerHTML = data.msg
    }
    input.onblur = function () {
      let username = this.value
      const script = document.createElement('script')
      script.src = 'http://127.0.0.1:8000/check-username'
      document.body.appendChild(script)
    }
  </script>
</body>

服务端:

app.all('/check-username', (request, response) => {
  const data = {
    exist: 1,
    msg: '用户名已存在'
  }
  let str = JSON.stringify(data)
  response.send(`handle(${str})`)
})

 结果:

 3.利用 jQuery 发送 jsonp 请求

未完待续。。。就差一点了。。。这个有点复杂qaq

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

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

相关文章

js 基础知识 forEach 和 map 的区别,及 map 不加 return 返回什么

问题一&#xff1a;forEach 和 map 之间的区别&#xff1a; 1、forEach 不返回新数组&#xff0c;map 返回新数组&#xff0c;其中包含回调函数的返回值。 2、用途&#xff1a;如果只想要遍历数组并对每个元素执行某些操作而不产生新数组&#xff0c;那么应该使用 forEach&am…

全网最强JavaWeb笔记 | 万字长文爆肝JavaWeb开发——day04_Maven入门

万字长文爆肝黑马程序员2023最新版JavaWeb教程。这套教程打破常规&#xff0c;不再局限于过时的老套JavaWeb技术&#xff0c;而是与时俱进&#xff0c;运用的都是企业中流行的前沿技术。笔者认真跟着这个教程&#xff0c;再一次认真学习一遍JavaWeb教程&#xff0c;温故而知新&…

ETL工具-nifi干货系列 第八讲 处理器PutDatabaseRecord 写数据库(详细)

1、本节通过一个小例子来讲解下处理器PutDatabaseRecord&#xff0c;该处理器的作用是将数据写入数据库。 如下流程通过处理器GenerateFlowFile 生成数据&#xff0c;然后通过处理器JoltTransformJSON转换结构&#xff0c;最后通过处理器PutDatabaseRecord将数据写入数据库。如…

软件架构风格_4.虚拟机体系结构风格

虚拟机体系结构风格的基本思想是人为构建一个运行环境&#xff0c;在这个环境之上&#xff0c;可以解析与运行自定义的一些语言&#xff0c;这样来增加架构的灵活性。虚拟机体系结构风格主要包括解释器风格和规则系统风格。 1.解释器体系结构风格 一个解释器通常包括完成解释工…

首个适配Visual Studio平台的国产智能编程助手CodeGeeX正式上线!C#程序员必备效率神器!

CodeGeeX是一款免费的智能编程助手。 继CodeGeeX在Visual Studio Code、JetBrains IDEs全家桶、HBuilderX、deepin-IDE等主流IDE中上线后&#xff0c;用户呼声最高的Visual Studio平台的适配插件产品也正式推出上线了&#xff01;成为首个适配Visual Studio平台的国产智能编程…

docker导出导入镜像

docker导出镜像 查看要导出的镜像 docker images主要有两列 REPOSITORY TAG 导出命令 导出公式 docker save -o xxxx.tar REPOSITORY:TAG例子 docker save -o minio.tar minio/minio:latestminio/minio:latest可以使用image id代替&#xff0c;但是使用image id会导致导…

笔记: JavaSE day15 笔记

第十五天课堂笔记 数组 可变长参数★★★ 方法 : 返回值类型 方法名(参数类型 参数名 , 参数类型 … 可变长参数名){}方法体 : 变长参数 相当于一个数组一个数组最多只能有一个可变长参数, 并放到列表的最后parameter : 方法参数 数组相关算法★★ 冒泡排序 由小到大: 从前…

基于springboot实现校园周边美食探索及分享平台系统项目【项目源码+论文说明】

基于springboot实现园周边美食探索及分享平台系统演示 摘要 美食一直是与人们日常生活息息相关的产业。传统的电话订餐或者到店消费已经不能适应市场发展的需求。随着网络的迅速崛起&#xff0c;互联网日益成为提供信息的最佳俱渠道和逐步走向传统的流通领域&#xff0c;传统的…

2024 ccfcsp认证打卡 2023 05 01 重复局面

2023 05 01 重复局面 题目题解1题解2区别&#xff1a;数据存储方式&#xff1a;时间复杂度&#xff1a;空间复杂度&#xff1a; 总结&#xff1a; 题目 题解1 import java.util.*;public class Main {public static void main(String[] args) {Scanner input new Scanner(Sys…

vivado eFUSE 寄存器访问和编程

eFUSE 寄存器访问和编程 注释 &#xff1a; 在 MPSoC 和 Versal 器件上不支持以下 eFUSE 访问和编程方法。 7 系列、 UltraScale 和 UltraScale 器件具有一次性可编程位用于执行特定功能 &#xff0c; 称为 eFUSE 位。不同 eFUSE 位类型如 下所述&#xff1a; • …

利用Winform实现简陋版的温度计(仅供参考)

本人水平有限&#xff0c;如有写得不对的地方&#xff0c;望指正。为了简单化&#xff0c;做了一个简陋版的温度计控件&#xff0c;有点丑哈。本文的内容仅供参考 测试环境&#xff1a; visual studio 2017 .net framework 4.0 效果图如下&#xff1a; 步骤如下&#xff1a;…

SpringBoot 微服务项目,打包报错:找不到符号

错误定位到这个代码&#xff0c;调试、编译都正常&#xff0c;就打包报错 最后发现&#xff0c;这个类是其他项目里的&#xff0c;需要重新生成其他项目后&#xff0c;再来打包就行了。

dhcp中继代理

不同过路由器分配ip了&#xff0c;通过一台服务器来代替&#xff0c;路由器充当中继代理功能&#xff0c;如下图 服务器地址&#xff1a;172.10.1.1/24 配置流程&#xff1a; 1.使能dhcp功能 2.各个接口网关地址&#xff0c;配置dhcp中继功能 dhcp select relay &#xff0…

ansible-自动化工具

一、ansible概述 不是C/S架构&#xff0c;就是一种工具 1&#xff1a;linux自动化运维 编写程序实现运维自动化&#xff1a;shell python 工具模式自动化&#xff1a; ①OS Provisioning&#xff1a; RedHat satellite&#xff1b;PXE&#xff08;可实现dhcp和tftp&#…

基于深度学习的吸烟检测系统(网页版+YOLOv8/v7/v6/v5代码+训练数据集)

摘要&#xff1a;本文深入研究了基于YOLOv8/v7/v6/v5等深度学习模型的吸烟行为检测系统&#xff0c;核心采用YOLOv8并整合了YOLOv7、YOLOv6、YOLOv5算法&#xff0c;进行性能指标对比&#xff1b;详述了国内外研究现状、数据集处理、算法原理、模型构建与训练代码&#xff0c;及…

HDLbits 刷题 --Conditional

学习: Verilog has a ternary conditional operator ( ? : ) much like C: (condition ? if_true : if_false) This can be used to choose one of two values based on condition (a mux!) on one line, without using an if-then inside a combinational always block. …

MyBatis强大的动态Sql功能

1.动态不定增加 根据需求 , 动态的拼接SQL 。 用户有的信息是必须输入&#xff0c;但有的不是必须进行输入 比如在填写注册信息的时候&#xff0c;有时候密码是一定要填写的&#xff0c;而银行卡号不是必须填写的 1)注解方式 测试类中 &#xff1a; 使用 if 标签 可以实现动…

SAP 销售订单BOM使用场景简介

SAP系统中通常会存在很多的BOM类型,有生产订单BOM、销售订单BOM、WBSBOM、标准BOM这几类。 订单BOM >= 销售BOM >= 标准BOM 订单BOM:通常是根据标准BOM基础上由PMC去调整一个物料的用量等,根据生产订单的BOM 销售BOM:根据销售订单号+行项目号创建的BOM,是根据特定…

定时器与晶振时钟、中断系统、定时中断

定时器 简介&#xff1a; C51中的定时器和计数器是同一个硬件电路支持的&#xff0c;通过寄存器配置不同&#xff0c;就可以将他当做定时器 或者计数器使用。 确切的说&#xff0c;定时器和计数器区别是致使他们背后的计数存储器加1的信号不同。当配置为定时器使用时&#xff0…

一维数组oj练习(4)

又是一维数组的练习.... 小A的学号在数组中可以看成a[k]&#xff0c;在判断谁大于a[k]。大于的数用sum来统计&#xff0c;最后输出。 #include<cstdio> int a[10010],n,k,sum; int main(){scanf("%d %d",&n,&k);for(int i1;i<n;i){scanf("%d…