AJAX —— 学习(三)(完结)

news2024/10/6 12:24:45

目录

一、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 实现

 3.利用 jQuery 发送 jsonp 请求

4.CORS 跨域设置


一、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 请求

客户端代码:

 <script>
    $('button').eq(0).click(function () {
      $.getJSON('http://127.0.0.1:9000/jquery-jsonp-server?callback=?', function (data) {
        console.log(data)
      })
    })
  </script>

服务端代码:

const express = require('express')
const app = express()
app.all('/jquery-jsonp-server', (request, response) => {
  const data = {
    name: '地方',
    city: ['北京', '上海', '深圳']
  }
  let str = JSON.stringify(data)
  response.end(`handle(${str})`)
})
app.listen(9000, () => {
  console.log('服务已启动')
})

查看报文:

发现出现了一个 callback 值,是 jquery 注册的函数,回来返回这个函数的调用,前端就能对这个数据处理

在服务端加上下面的代码,把请求当中 url 中的 callback参数值 cb 取出 ,就是上一个图片中的字符串,它是一个函数

let cb = request.query.callback

 使用这个调回函数返回查看

  response.end(`${cb}(${str})`)

然后返回调用就变成下面的形式了

最后在客户端调用返回的数据 data 就是服务端的对象数据

<body>
  <button>点击发送jsonp 请求</button>
  <div id="result"></div>
  <script>
    $('button').eq(0).click(function () {
      $.getJSON('http://127.0.0.1:9000/jquery-jsonp-server?callback=?', function (data) {
        $('#result').html(`
          名称:${data.name}<br>
          城市:${data.city}
        `)
      })
    })
  </script>
</body>

服务端完整代码:

const express = require('express')
const app = express()
app.all('/jquery-jsonp-server', (request, response) => {
  const data = {
    name: '地方',
    city: ['北京', '上海', '深圳']
  }
  let str = JSON.stringify(data)

  let cb = request.query.callback
  response.end(`${cb}(${str})`)
})

app.listen(9000, () => {
  console.log('服务已启动')
})

结果正确成功拿到结果

4.CORS 跨域设置

全称是跨域资源共享,是官方的解决方案,不同于 jsonp 是程序员自己弄出来的

不需要在客户端做操作 正常发 AJAX 请求,只在服务器中进行设置响应头就可以限制跨域

支持 get post 请求 其它也支持

客户端代码:

<script>
  const btn = document.querySelector('button')
  btn.onclick = function(){
    const x= new XMLHttpRequest();
    x.open('get','http://127.0.0.1:9000/cors-server')
    x.send()
    x.onreadystatechange = function () {
        if (x.readyState === 4) {
          if (x.status >= 200 && x.status < 300) {
           console.log(x.response)
          }
        }
      }
  }

服务端代码:

app.all('/cors-server', (request, response) => {
  
  response.send(`hello cors`)
})

运行报错:服务端没有返回 CORS 头报错

这是因为我们之前会加上报错红字里面的 access... 的 响应头来支持跨域,但是这次没加,看下面图片可知我们客户端是 file 协议 而 服务端 是http 协议,所以这属于一个跨域请求

我们像以前一样设置一个下面的允许跨域的响应头,允许谁向我发送请求

后面是设置允许访问的地址,* 就是允许所有地址跨域访问

response.setHeader('Access-Control-Allow-Origin', '*')

还有很多请求头可以设置,可以自己看看 就比如下面 写完下面两句话就能自定义请求头和方法不报错了 

  response.setHeader('Access-Control-Allow-Headers', '*')
  response.setHeader('Access-Control-Allow-Method', '*')

 问题解决

服务端改进代码:

app.all('/cors-server', (request, response) => {
  response.setHeader('Access-Control-Allow-Origin', '*')
  response.send(`hello cors`)
})

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

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

相关文章

批量导入svg文件作为图标使用(vue3)vite-plugin-svg-icons插件的具体应用

目录 需求svg使用简述插件使用简述实现安装插件1、配置vite.config.ts2、src/main.ts引入注册脚本3、写个icon组件4、使用组件 需求 在vue3项目中&#xff0c;需要批量导入某个文件夹内数量不确定的svg文件用来作为图标&#xff0c;开发完成后能够通过增减文件夹内的svg文件&a…

C++高频面试知识总结 part2

C高频面试 1.sizeof是什么&#xff1f;sizeof一个class大小怎么确定&#xff1f;是在编译期还是在运行期确定?2.函数重载的机制&#xff0c;重载是在编译期还是在运行期确定&#xff0c;重载有额外开销吗3.函数重写在编译还是运行时确定&#xff1f;4.如何找到虚函数表&#x…

MySQL复制拓扑4

文章目录 主要内容一.启用GUID并配置循环复制1.其中&#xff0c;UUID用来唯一标识每一个服务器&#xff0c;事务的编号记录了在该服务器上执行的事务的顺序。使用SELECT server_uuid\G命令可以查看服务器的UUID&#xff0c;sever1的UUID值显示如下&#xff1a;代码如下&#xf…

架构图设计

我们了解了软件架构后&#xff0c;方便了我们理解软件各方面的解读&#xff0c;但是如果我们开发中有必要自己设计架构图吗&#xff1f;有&#xff0c;但是不会轮到你。这里浅浅讲一下软构图的设计&#xff0c;相信当你用一张或几张图来描述系统时&#xff0c;是不是经常遇到以…

域控报错:Windows无法创建对象 XX,因为目录服务无法分配相对标识符。

当域控制器报告错误“Windows无法创建对象&#xff0c;因为目录服务无法分配相对标识符”时&#xff0c;这通常是指在Active Directory环境中尝试创建新用户、计算机或其他安全主体时&#xff0c;域控制器无法从预先分配给每个域的RID&#xff08;Relative Identifier&#xff…

Fire Smoke - Dynamic Nature

烟雾、火灾和爆炸预制件、着色器的集合。粒子支持HD、URP和标准渲染,自然制造风,因此它们对风速、方向和颤抖做出反应。 包装支持: Unity 2021.2及更高版本 Unity 2021.2 HD RP Unity 2021.2 URP Unity 2021.3及更高版本 Unity 2021.3 LTS HD RP Unity 2021.3 LTS URP Unity…

【SkyWorking】服务追踪工具

使用 Jar 启动时添加 VM 参数 -javaagent:/path/to/apache-skywalking-apm-incubating/agent/skywalking-agent.jar -Dskywalking.agent.application_codeYOUR_APP_NAME或 -javaagent:D:\city\skywalking-agent\skywalking-agent.jaragent.service_namemy-service,agent.instan…

贪心算法|45.跳跃游戏II

力扣题目链接 class Solution { public:int jump(vector<int>& nums) {if (nums.size() 1) return 0;int curDistance 0; // 当前覆盖最远距离下标int ans 0; // 记录走的最大步数int nextDistance 0; // 下一步覆盖最远距离下标for (int i 0;…

YoloV8实战:使用YoloV8实现水下目标检测(RUOD)

摘要 水下目标检测技术在生态监测、管道检修、沉船捕捞等任务中发挥着重要作用。常用的检测方法包括高清视像、侧扫声呐等。光学图像检测因高分辨率和灵活性&#xff0c;在近距离检测中优势显著。但水下图像受水体吸收、衰减、光源分布等影响&#xff0c;呈现蓝绿色&#xff0…

拾光坞N3 ARM 虚拟主机 i茅台项目

拾光坞N3 在Dcoker部署i茅台案例 OS&#xff1a;Ubuntu 22.04.1 LTS aarch64 cpu&#xff1a;RK3566 ram&#xff1a;2G 部署流程——》mysql——》java8——》redis——》nginx mysql # 依赖 apt update apt install -y net-tools apt install -y libaio* # 下载mysql wg…

太阳能自动气象站讲解

TH-QC10随着科技的不断进步和环保意识的日益增强&#xff0c;太阳能自动气象站逐渐成为了气象观测领域的新宠。这种结合了清洁能源与先进技术的装置&#xff0c;不仅为气象数据的获取提供了更为便捷、高效的方式&#xff0c;同时也为环保事业贡献了自己的力量。 一、太阳能自动…

PCI总线学习笔记:读写篇

前言 最近在写E1000网卡的驱动&#xff0c;这其中涉及到了PCI总线的相关内容。但是网上大部分关于PCI的文章都只局限在概念上的描述&#xff0c;并没有给出具体的例子来解释。这其实也是情理之中的&#xff0c;因为PCI总线规范就像是一个抽象的接口&#xff0c;其具体怎么实现…

[LeetCode][LCR133]位 1 的个数——快速从右边消去1

题目 LCR 133. 位 1 的个数 编写一个函数&#xff0c;输入是一个无符号整数&#xff08;以二进制串的形式&#xff09;&#xff0c;返回其二进制表达式中数字位数为 ‘1’ 的个数&#xff08;也被称为 汉明重量).&#xff09;。 提示&#xff1a; 请注意&#xff0c;在某些语言…

CTF之矛盾

这一题就是php的弱比较“” 这里要求输入的不是数字&#xff0c;并且输入要为1才打印flag 那我们就输入一个1后面接随便什么字符&#xff0c;因为php的弱比较将字符与数字进行比较的时候&#xff0c;会把字符转换成数字再比较&#xff0c;当转换到字符时后面便都为空了 flag{…

蓝桥杯 经验技巧篇

1. 注意事项 &#x1f468;‍&#x1f3eb; 官方通知 &#x1f468;‍&#x1f3eb; 资料文档 时间&#xff1a;4月13日 9:00~13:00 &#xff08;时长 4小时&#xff09;物品 准考证&#xff08;赛前一周开放下载&#xff0c;自行打印&#xff09;学生证身份证笔、水、外套&a…

层次式架构设计-体系结构概述

层次式架构是软件体系结构设计中最为常用的一种架构形式&#xff0c;它为软件系统提供了一种在结构、行为和属性方面的高级抽象。其核心思想是将系统组成为一种层次结构&#xff0c;每一层为上层服务&#xff0c;并作为下层的客户。 层次式架构设计技术&#xff1a; 表现层中间…

LeetCode刷题之31.下一个排列

文章目录 1. 题目2.分析3.解答3.1 先排序&#xff0c;后交换3.2 先交换&#xff0c;后排序 1. 题目 整数数组的一个 排列 就是将其所有成员以序列或线性顺序排列。 例如&#xff0c;arr [1,2,3] &#xff0c;以下这些都可以视作 arr 的排列&#xff1a;[1,2,3]、[1,3,2]、[3…

C——找单身狗2

题目内容&#xff1a; 在一个数组中&#xff0c;室友两个数字出现了一次&#xff0c;其他所有数字都出现了两次。找出只出现一次的数字。 如&#xff1a;1&#xff0c;2&#xff0c;3&#xff0c;4&#xff0c;5&#xff0c;1&#xff0c;2&#xff0c;3&#xff0c;4&#xff…

交互设计师、UI设计师、视觉设计师面试作品集包装模板figma源文件

页面数量&#xff1a;19页 页面尺寸&#xff1a;1920*1080PX 交付格式&#xff1a;figma 赠送文件&#xff1a;24款高质量样机 交付文件&#xff1a;作品集模板源文件、作品集包装psd源文件、作品集所用字体文件 该作品集虽然只有19页&#xff0c;但可根据需求复制作品集里已有…

SpringBoot3整合RabbitMQ之三_工作队列模型案例

SpringBoot3整合RabbitMQ之三_工作队列模型案例 文章目录 SpringBoot3整合RabbitMQ之三_工作队列模型案例2. 工作队列模型1. 消息发布者1. 创建工作队列的配置类2. 发布消费Controller 2. 消息消费者One3. 消息消费者Two4. 消息消费者Three5. 输出结果 2. 工作队列模型 1. 消息…