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

目录

一、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`)
})

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

简历复印--原型模式

1.1 夸张的简历 简历的打印。"对编程来说&#xff0c;简单的复制粘贴极有可能造成重复代码的灾难。我所说的意思你根本还没听懂。那就以刚才的例子&#xff0c;我出个需求你写写看&#xff0c;要求有一个简历类&#xff0c;必须要有姓名&#xff0c;可以设置性别和年龄&am…

第十四届蓝桥杯省赛大学C组(C/C++)填充

原题链接&#xff1a;填充 有一个长度为 n 的 01 串&#xff0c;其中有一些位置标记为 ?&#xff0c;这些位置上可以任意填充 0 或者 1&#xff0c;请问如何填充这些位置使得这个 01 串中出现互不重叠的 0 和 1 子串最多&#xff0c;输出子串个数。 输入格式 输入一行包含一…

SQLite 4.9的 OS 接口或“VFS”(十三)

返回&#xff1a;SQLite—系列文章目录 上一篇:SQLite字节码引擎&#xff08;十二&#xff09; 下一篇:SQLite 4.9的虚拟表机制(十四) 1. 引言 本文介绍了 SQLite OS 可移植性层或“VFS” - 模块位于 SQLite 实现堆栈底部 提供跨操作系统的可移植性。 VFS是Virtual File…

5560.树的直径

蛮不错的一道题目&#xff0c;你要利用树的性质分析出&#xff0c;你只需要维护上一次的树的直径的两个端点就好了 #include<iostream>using namespace std; using ll long long; using pii pair<int,int>; const int N 6e510; const int inf 0x3f3f3f3f; cons…

算法:树形dp(树状dp)

文章目录 一、树形DP的概念1.基本概念2.解题步骤3.树形DP数据结构 二、典型例题1.LeetCode&#xff1a;337. 打家劫舍 III1.1、定义状态转移方程1.2、参考代码 2.ACWing&#xff1a;285. 没有上司的舞会1.1、定义状态转移方程1.2、拓扑排序参考代码1.3、dfs后序遍历参考代码 一…

MySQL复制拓扑4

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

Vue3_2024_7天【回顾上篇watch常见的后两种场景】

随笔&#xff1a;这年头工作不好找咯&#xff0c;大家有学历提升的赶快了&#xff0c;还有外出人多注意身体&#xff0c;没错我在深圳这边阳了&#xff0c;真的绝啊&#xff0c;最尴尬的还给朋友传染了&#xff01;&#xff01;&#xff01; 之前三种的监听情况&#xff0c;监听…

文本识别 OCR 解决方案

Capture2Text 便携式 OCR 工具 Capture2Text 能够使用键盘快捷键快速对屏幕的一部分进行 OCR。 默认情况下&#xff0c;生成的文本将保存到剪贴板。支持中文、英文、法文、德文、日文、韩文、俄文、西班牙文等 90 多种语言。 Capture2Text 是便携式工具&#xff0c;不需要安装…

快速了解FastAPI与Uvicorn是什么?

概念 什么是Uvicorn Python Uvicorn 是一个快速的 ASGI&#xff08;Asynchronous Server Gateway Interface&#xff09;服务器&#xff0c;用于构建异步 Web 服务。它基于 asyncio 库&#xff0c;支持高性能的异步请求处理&#xff0c;适用于各种类型的 Web 应用程序。 Uvi…

SEO超级外链工具源码

源码简介 超级外链工具&#xff0c;是一款在线全自动化发外链的推广工具。使用本工具可免费为网站在线批量增加外链&#xff0c;大大提高外链发布工作效率&#xff0c;是广大草根站长们必备的站长工具。 搭建环境 PHP 5.6 安装教程 上传源码压缩包到网站目录并解压即可 首…

Linux安装最新版Docker完整教程

参考官网地址&#xff1a;Install Docker Engine on CentOS | Docker Docs 一、安装前准备工作 1.1 查看服务器系统版本以及内核版本 cat /etc/redhat-release1.2 查看服务器内核版本 uname -r这里我们使用的是CentOS 7.6 系统&#xff0c;内核版本为3.10 1.3 安装依赖包 …

【数据结构(二)】顺序表与ArrayList

❣博主主页: 33的博客❣ ▶文章专栏分类:数据结构◀ &#x1f69a;我的代码仓库: 33的代码仓库&#x1f69a; &#x1faf5;&#x1faf5;&#x1faf5;关注我带你学更多数据结构知识 目录 1.前言2.定义IList接口3.MyArraylist实现接口3.1定义成员变量与构造方法3.2添加元素3.3…

构建未来数字化世界的统一用户中心产品架构

随着数字化时代的到来&#xff0c;用户数据管理变得愈发复杂&#xff0c;各类应用和服务的涌现使得用户信息分散存储&#xff0c;导致了数据孤岛和体验碎片化的问题。在这样的背景下&#xff0c;统一用户中心产品架构应运而生&#xff0c;为构建数字化世界提供了全新的解决方案…

S7-200 SMART 应用第003期-数字量输入模块接线

概述 S7-200 SMART作为西门子的一款高性价比PLC产品,很多工控电气工程师在选型和电路图设计时,对模块接线并不是非常清楚,为了使大家更好的了解和掌握该部分,本文从CPU本体、数字量输入(DI)、数字量输出(DQ)向大家详细介绍S7-200 SMART 详细的接线和注意事项。 不同型号C…

2023年度总结:允许迷茫,破除迷茫;专注自身,把握当下

0、前言 &#x1f4dc;为什么24年已经过了几个月&#xff0c;才提笔写这年度总结呢&#xff1f;毫不羞愧直问我的内心&#xff0c;其实就是懒罢了。直到前几天朋友看到了我去年写的总结&#xff0c;我自己点进那篇总结&#xff0c;完完整整的看了一遍&#xff0c;又翻看我23年…

ideaSSM 网上选课管理系统bootstrap开发mysql数据库web结构java编程计算机网页源码maven项目

一、源码特点 idea 开发 SSM 网上选课管理系统是一套完善的信息管理系统&#xff0c;结合SSM框架和bootstrap完成本系统&#xff0c;对理解JSP java编程开发语言有帮助系统采用SSM框架&#xff08;MVC模式开发&#xff09;&#xff0c;系统具有完整的源代码和数据库&#xff…

二分法题集1

1 二分查找 分析&#xff1a; 这是一道很简单的二分法题&#xff0c;定义两个指针和中间值middle&#xff0c;判断middle对应数组值与目标值的大小关系&#xff0c;从而对left和right进行修改。由于太过基础&#xff0c;代码简单基础就不多赘述。 目录 1 二分查找 分析&…

PyQt PySide6零基础入门与项目实战视频教程

目录 课程亮点课程大纲第一章&#xff1a;基础篇 PySide6开发环境安装第二章 控件与布局篇 PySide6常用控件与界面布局使用介绍第三章 信号槽与事件机制第四章 QMainWindow应用篇第五章 样式表qss与自定义控件第六章 图表与曲线第七章 数据库编程第八章 项目实战&#xff1a;高…

FJSP:小龙虾优化算法(Crayfsh optimization algorithm,COA)求解柔性作业车间调度问题(FJSP),提供MATLAB代码

一、柔性作业车间调度问题 柔性作业车间调度问题&#xff08;Flexible Job Shop Scheduling Problem&#xff0c;FJSP&#xff09;&#xff0c;是一种经典的组合优化问题。在FJSP问题中&#xff0c;有多个作业需要在多个机器上进行加工&#xff0c;每个作业由一系列工序组成&a…

二叉树的介绍

学习堆排序时先了解下二叉树&#xff0c;因为堆排序中使用了二叉树。 一、二叉树介绍 二叉树&#xff08;binary tree&#xff09;树的每个节点最多有2个孩子节点。注意&#xff0c;这里是最多有2个&#xff0c;也可能只有1个&#xff0c;或者没有孩子节点。 二叉树结构如图…