AJAX(二) axios、fetch发送请求,同源策略,跨域解决方案等

本文介绍了使用axios和fetch进行AJAX请求的方法,包括GET和POST请求的实现,并详细讲解了同源策略的概念和案例,以及解决跨域问题的JSONP和CORS策略。重点阐述了CORS的工作原理和设置响应头的方式。
摘要由CSDN通过智能技术生成

目录

(一)其他函数的AJAX请求发送

1.axios函数

(1)发送get请求

(2)发送post请求

(3)axios函数发送请求

2.fetch函数(较少使用)

(二)跨域

1.同源策略

(1)概念

(2)案例证明

2.解决跨域的方案

(1)JSONP

(2)CORS


(一)其他函数的AJAX请求发送

1.axios函数

引入axios方法:

  1. 在<head>里引入<script crossorigin="anonymous" src="https://cdn.bootcdn.net/ajax/libs/axios/1.3.6/axios.js"></script>(bootstrap网站里找)
  2. 下载axios:npm install axios -g

推荐第一种方法

服务端:

app.all('/axios-server', (request, response) => {
    // 设置响应头 设置允许跨域
    response.setHeader('Access-Control-Allow-Origin', '*')
    // 设置响应头 允许任意类型的请求头
    response.setHeader('Access-Control-Allow-Headers', '*')
    // 设置发送
    response.send('response from axios!')
})

(1)发送get请求

// 点击get发送请求
btns[0].addEventListener('click', function () {
    // get请求
    axios.get('/axios-server', {
    // url参数
    params: {
        id: 123,
        vip: true
    },
    // 请求头信息
    headers: {
        Name: 'csq',
        Age: 18
    }
}).then(response => (
        console.log(response) //获取响应结果 promise的then函数
    ))
})

promise的then()函数,现在还不清楚具体的功能和原理,学完ajax就补

用于获取响应体的信息

 

(2)发送post请求

// 点击post发送请求 
btns[1].addEventListener('click', function () {
    // 发送post 格式:post(url{},{请求体data},{其他参数})
    axios.post('/axios-server', {
        // 请求体
        uname: 'admin',
        pwd: '123'
    }, {
        // 其它参数
        // url参数
        params: {
            id: 1,
            vip: true
        },
        // 请求头
        headers: {
            Name: 'csq',
            Age: 18
        }    
    })
})

 格式:post(url{},{请求体data},{其他参数}) 

(3)axios函数发送请求

// 点击ajax 用axios函数发送请求
btns[2].addEventListener('click', function () {
    axios({
        // 发送方式(默认get)
        method: 'POST',
        // url
        url: '/axios-server',
        // url参数
        params: {
            id: 1,
            vip: true
        },
        // 请求头
        headers: {
            Name: 'csq',
            Age: 18
        },
        // 请求体
        data: {
            uname: 'admin',
            pwd: '123'
        }
    }).then(response => {
        // promise 获取数据
        console.log(response)
        console.log(response.status)
        console.log(response.statusText)
        console.log(response.headers)
        console.log(response.data)
        console.log(response.config.headers.Name)
    })
})

 

2.fetch函数(较少使用)

服务端:

// fetch函数 响应路由规则
app.all('/fetch-server', (request, response) => {
    // 设置响应头 设置允许跨域
    response.setHeader('Access-Control-Allow-Origin', '*')
    // 设置响应头 允许任意类型的请求头
    response.setHeader('Access-Control-Allow-Headers', '*')
    // 设置发送
    response.send('response from fetch!')
})
// fetch函数发送请求
btn.addEventListener('click', function () 
    fetch('http://127.0.0.1:8000/fetch-server', {
        // 发送方式
        method: 'POST',
        // url参数
        params: { 
            id: 123,
            vip: true
        },
        // 请求头信息
        headers: {
            Name: 'csq',
            Age: 18
        }, 
        // 请求体 字符串类型 还有别的类型:formData等
        body: 'uname=admin&pwd=123'
        // 响应体的结果获取 then返回promise类型
    }).then(response => {
        return response.text()//转换成字符串类型
        // return response.json() //转换成json类型
    }).then(response => {
        console.log(response)
    })
})

 此处使用两个then()函数 

(二)跨域

1.同源策略

(1)概念

同源策略是浏览器最核心最基本的安全功能

如果2个URL的协议、域名(主机)、端口号都相同,则称它们同源

同源策略是浏览器的行为,是为了保护本地数据不被JavaScript代码获取回来的数据污染

如果非同源(即跨域),那么在请求数据时,浏览器会在控制台中报一个异常,提示拒绝访问,因此拦截的是客户端发出的请求回来的数据接收,即请求发送了,服务器响应了,但是无法被浏览器接收

跨域不能进行如下操作:

  • Cookie、LocalStorage 和 IndexDB 无法读写
  • DOM 和 Js对象无法获得
  • AJAX请求不能发送

可以跨域的标签:

在浏览器中, <script> 、<img>、<iframe>、<link>等标签都可以跨域加载,而不受浏览器的同源策略的限制, 这些带src属性的标签每次加载的时候,实际上都是浏览器发起一次GET请求, 不同于普通请求(XMLHTTPRequest)的是,通过src属性加载的资源,浏览器限制了JavaScript的权限,使其不能读写src加载返回的内容

(2)案例证明

服务端:

// 1.引入express
const express = require('express')
// 2.创建初始对象
const app = express()
// 3.路由机制 get
app.get('/server', (request, response) => {
    // 发送文件 __dirname:绝对路径 D:\ajax\跨域\1.同源策略
    response.sendFile(__dirname + '/index.html')
})

// /data
app.get('/data', (request, response) => {
    response.send('数据来了数据来了')
})

// 4.端口监听事件
app.listen(8000, () => {
    console.log('服务器8000端口正在运行中...')
})

        发送文件:sendFile(__dirname+'文件名') 

index.html文件 :

    <!-- 引入axios -->
    <script crossorigin="anonymous" src="https://cdn.bootcdn.net/ajax/libs/axios/1.3.6/axios.js"></script>
</head>

<body>
    <h1>同源策略</h1>
    <button>点击发送请求</button>
    <script>
        // 点击按钮发送请求
        const btn = document.querySelector('button')
        // 用axios函数发送ajax
        btn.addEventListener('click', function () {
            // 因为同源,故url路径可省略简写为/data即可
            axios.get('/data', {}).then(response => {
                console.log(response.data)
            })
        })
    </script>
</body>

index.html和服务端server.js同源,点击按钮发送请求正确

 若将index.html以liveServer形式打开,因为liveServer用的是5500端口,则与服务端不同源

 报错,不能发送ajax请求(maybe)

2.解决跨域的方案

(1)JSONP

原理:动态创建script标签,src属性指向没有跨域限制;指向一个接口,接口返回的格式一定是函数表达式(数据)

jsonp的使用:

1、动态创建script标签

        const script = document.createElement('script')

2、添加script路径

        script.src = 'server.js的路径'

3、将script标签插入到目标位置

        document.body.appendChild(script

jsonp的缺点

1、只支持get请求,不支持post等请求

2、多次点击后页面会存在大量废弃script标签,使用onload事件在script标签作用后立即删除

案例分析

输入用户名,若已经存在则输入框边框变为红色,提示用户名已存在

<body>
    <input type="text">
    <p></p>
    <script>
        // 判断输入的内容在服务端内是否存在,不存在则输入框变为红色边框,文字提示重复
        const ipt = document.querySelector('input')
        const p = document.querySelector('p')
        // 失去焦点事件 用change/blur
        ipt.addEventListener('change', function () {
            // 动态创建script标签
            const script = document.createElement('script')
            // 写src
            script.src = 'http://127.0.0.1:8000/check-uname'
            // 将标签写到p标签后
            document.body.appendChild(script)
        })

        // 声明handle函数
        function handle(data) {
            // 如果值相等表明重复
            if (data.uname === ipt.value) {
                p.innerHTML = data.msg
                p.style.color = 'red'
                ipt.style.border = '2px solid red'
            } else {
                p.innerHTML = ''
                ipt.style.border = '1px solid #000'
            }
        }
    </script>
</body>

服务端:

// 1.引入express
const express = require('express')
// 2.创建初始对象
const app = express()
// 3.路由机制 get
app.get('/check-uname', (request, response) => {
    const data = {
        uname: 'csq',
        age: 18,
        msg: '输入用户名已存在!'
    }
    // 将对象转换为字符串
    let str = JSON.stringify(data)
    // 调用handle函数
    response.send(`handle(${str})`)
})

// 4.端口监听事件
app.listen(8000, () => {
    console.log('服务器8000端口正在运行中...')
})

 弊端:

多次进行get请求后页面会留存大量script标签,造成大量冗余

 解决方法:用onload事件,即用即删,script标签完全加载完毕后触发

// 失去焦点事件 用change/blur
ipt.addEventListener('change', function () {
    // 1.动态创建script标签
    const script = document.createElement('script')
    // 2.写src
    script.src = 'http://127.0.0.1:8000/check-uname'
    // 3.将标签写到p标签后
    document.body.appendChild(script)

    // 多次请求get事件后,页面留存大量script标签
    // 4.用onload事件,即用即删
    script.addEventListener('load', function () {
        script.remove()
    }) 
})

此时script标签已删除 

(2)CORS

跨域资源共享是一种基于  HTTP 头的机制,该机制通过允许服务器标示除了它自己以外的其他 源(域、协议或端口),使得浏览器允许这些源访问加载自己的资源

CORS工作原理:

通过设置一个响应头来告诉浏览器该请求允许跨域,浏览器接收到该响应后就会响应对方 

允许跨域的响应头

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

更多响应头见下方链接

跨源资源共享(CORS) - HTTP | MDN

(三)小感悟

终于算是肤浅的学完了ajax?还有很多细节不熟悉,等以后遇到了具体的再补吧,学前端进度还不到30%...继续加油!!! 

DogEgg_001
关注 关注
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Fetch发送请求 + 解决跨域问题
m0_59897687的博客
04-22 1万+
目录 fetch的基本用法: 使用fetch发送get请求: 使用fetch发送post请求: 解决跨域问题: fetch()方法提供了一种简单,合理的方式来跨网络异步获取资源。 可以使用fetch向服务器发送get请求或post请求来获取数据 fetch的基本用法: fetch('/url').then(data=>{ return data.text(); }).then(ret=>{ //注意,这里才是得到的最终数据 console.log(ret); }); 使
ajax尚硅谷笔记——跨域请求axios发送ajax请求、jquery发送ajax请求
weixin_53317758的博客
11-21 2103
script标签作为函数被服务调用,其中加上该函数的参数作为用户需要看到的数据内容
Fetch请求跨域处理
qq_36400206的博客
03-25 8865
AjaxFetch请求跨域处理      浏览器安全的基石是"同源政策"(same-origin policy),这里的三源是指协议,端口和域名。同源政策是为了保护用户的安全,如下将介绍,跨域的解决办法。 一. Jsonp 由于这种方式只支持get方法的跨域,本身具有一定的局限性,因此在这里不详细的介绍。 . Nginx反向代理 如今项目多采...
fetch跨域请求数据的前端设置和后端php的header设置
最新发布
cdcdhj的博客
08-14 436
跨源请求,也称为CORS(Cross-Origin Resource Sharing)请求,是Web开发中常见的一种需求,允许一个网页的JavaScript代码向与该网页不同源的服务器发出HTTP请求。// 允许的HTTP方法这几种。这里做测试的是前端http://127.0.0.1:5500/fetchcors.html。
fetch跨域请求】cors
热门推荐
漫游学海之旅
03-26 3万+
当使用fetch 发起跨域请求时,CORS(跨域资源共享Cross-origin resource sharing)请求fetch const body = {name:"Good boy"}; fetch("http://localhost:8000/API",{ headers:{ 'content-type':'application/json' }
fetch跨域问题
weixin_33971977的博客
10-12 212
fetch(url,{ method:'post', mode:"cors", //允许跨域 no-cors不允许跨域 // credentials:"include", //跨域请求时是不带cookie的,添加该属性表示强制加入凭据头,请求时就会携带cookie。但是如果加上这个属性,那么服务器的Access-Contro...
fetch发送请求 && 解决跨域问题
qijingpei的博客
10-06 6698
解决跨域问题:加入跨域用的响应头: “Access-Control-Allow-Origin” : “*”, “Access-Control-Allow-Credentials” : true fetch()发送请求的代码如下: fetch("localhost:8080/getAll", { method: 'post', // 如果是get方式的话,只能把参数拼接在url里传过去,ge...
AJAX(2):Axios,fatch,jquery发送AJAX请求同源策略,解决跨域
qq_45994446的博客
09-04 239
中搜索axios复制script标签<script crossorigin="anonymous" src="https://cdn.bootcdn.net/ajax/libs/axios/0.19.2/axios.js"></script>;fetch它不像jquery和axios需要引入第三方库,它直接就能用,它就在window的内置对象中,直接就能用调用fetch函数。例1:使用script的src标签实现file协议到http协议的跨越,原理如此,不知道为啥运行不出来。通过script实现跨域
02 【axios fetch 跨域
DSelegent的博客
10-28 541
02 【axios fetch 跨域
AJAX学习笔记:什么是AJAX、http协议、AJAX请求发送方法(jQuery,Axiosfetch)、跨域、CORS
qq_48376006的博客
09-16 198
几种发送AJAX的方法,跨域问题,CORS等。
Vue跨域请求问题解决方案过程解析
11-19
配置完成后,我们可以在Vue组件中使用axiosfetch等库发送AJAX请求,例如: ```javascript axios.get('/api/blueberrypai/getBlueBerryJamInfo.php') .then(response => { console.log(response.data); }) ....
react中fetch之cors跨域请求的实现方法
08-27
本篇文章主要介绍了react中fetch之cors跨域请求的实现方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
fetch请求跨域问题
qq_43574083的博客
03-28 1212
fetch是比较基础的API,很多参数需要自家设置。在进行跨域POST请求时,有以下一个重要参数: method 指定请求方式,可选值:GET | POST | PUT | DELETE | OPTIONS。默认值:GET。 credentials 指定在发送cookies的情况,可选值:omit | same-origin | include。 默认值:same-origin。 omit: ...
跨域问题的解决
Az201706的博客
09-24 5040
跨域问题
fetch 跨域请求
weixin_34162695的博客
08-13 479
CORS cors是"Cross-Origin Resource Sharing"的简称,是实现跨域的一种方式,相对于其他跨域方式,比较灵活,而且不限制发请求使用的method,以下从几种情况分析cors使用。 GET跨域请求 前端代码 fetch('http://localhost:6888/test_get',{ meth...
VUE系列三:实现跨域请求(fetch/axios/proxytable)
weixin_34205826的博客
07-02 345
1. 在 config/index.js 配置文件中配置proxyTable 'use strict' // Template version: 1.3.1 // see http://vuejs-templates.github.io/webpack for documentation. const path = require('path') module.exports = { d...
WEB前端10- Fetch API(同步/异步/跨域处理)
XYX_888的博客
07-23 769
具体来说,同源策略要求网页中的所有资源(如脚本、样式表和 AJAX 请求)必须来自同一个域、协议和端口,否则就会出现跨域问题。代理服务器充当客户端和目标服务器之间的中介,它接收来自客户端的请求,然后将请求转发给目标服务器,并将目标服务器的响应返回给客户端。Promise 对象是 JavaScript 中处理异步操作的一种机制,它代表了一个异步操作的最终完成或失败,并且其结果值是可用的。: (可选)一个对象,包含配置 fetch 操作的设置,比如方法、头部、请求体、凭据等。这个参数允许精确调整请求的细节。
AJAX网络请求 —— Fetch发送跨域请求(三)
秋天,黄叶坠地,凉风有信。
03-17 5453
文章目录Fetch:跨源请求为什么需要 CORS?跨源请求简史)使用表单使用 script简单的请求用于简单请求的 CORSResponse header“非简单”请求Step 1 预检请求(preflight request)Step 2 预检响应(preflight response)Step 3 实际请求(actual request)Step 4 实际响应(actual response)凭据(Credentials)总结 Fetch:跨源请求 如果我们向另一个网站发送 fetch 请求,则该请求
Axios网络请求库实战与跨域解决方案
### 跨域问题及其解决方案 跨域问题源于浏览器的同源策略,它限制了不同源之间的交互。当请求的URL与当前页面的协议、域名或端口不匹配时,浏览器会拒绝请求,防止恶意攻击。 1. **同源策略**: 同源策略是浏览器...
写文章

热门文章

  • ReactRouter——路由配置、路由跳转、带参跳转、新route配置项 5480
  • Vue2项目实战:尚品汇(三)商品详情界面、加入购物车成功界面、购物车界面 4328
  • Vue3后台通用管理系统(三):用户登录与跳转、全局路由守卫 4196
  • NodeJS(二):npm包管理工具、yarn、npx、pnpm工具等 2705
  • AJAX(二) axios、fetch发送请求,同源策略,跨域解决方案等 2357

分类专栏

  • React 8篇
  • 每天写两道 11篇
  • Vue3 8篇
  • Vue2 14篇

最新评论

  • ReactRouter——路由配置、路由跳转、带参跳转、新route配置项

    遛达西: 写的不错。 新版的 react router 还算可以,比之前的好用不少。 感谢 hooks

  • React实战(一)初始化项目、配置router、redux、axios

    普通网友: 文章结构严谨有条,层次分明,读起来一点也不费劲,让人受益匪浅。【我也写了一些相关领域的文章,希望能够得到博主的指导,共同进步!】

  • React(五)useEffect、useRef、useImperativeHandle、useLayoutEffect

    普通网友: 大佬的文章写的太精辟了 让我深刻了解了这篇文章的精髓 谢谢大佬分享,希望继续创作优质博文。【我也写了一些相关领域的文章,希望能够得到博主的指导,共同进步!】

  • React(三)useReducer、useContext钩子的使用,redux库的初步使用

    CSDN-Ada助手: 恭喜你这篇博客进入【CSDN每天值得看】榜单,全部的排名请看 https://bbs.csdn.net/topics/618720958。

  • Vue2项目实战:尚品汇(二)搜索界面模块

    CSDN-Ada助手: 恭喜您写了第19篇博客,看来您对Vue2项目实战的经验丰富啊!搜索界面模块的实战经验对于我来说非常有用,谢谢您的分享。希望您能继续分享更多实战经验,比如其他模块的实现或者一些优化技巧,这样能让我们有更多的学习收获。期待您的下一篇博客!

最新文章

  • React+Nest实现无感登录
  • 每天写两道(数组篇)水果成篮、最小覆盖子串
  • 每天写两道(数组篇)有序数组的平方、长度最小的子数组
2024年22篇
2023年32篇
2022年5篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

玻璃钢生产厂家西宁广场玻璃钢雕塑哪家好晋城玻璃钢雕塑制作玻璃钢花盆简笔画教程户外广场玻璃钢雕塑现货天津玻璃钢景观雕塑施工厂家杨浦区镜面玻璃钢雕塑便宜包头景区玻璃钢雕塑生产厂家厦门翔安玻璃钢雕塑工厂梅州玻璃钢动物雕塑直销价格信阳玻璃钢雕塑制作建邺商场开业美陈壶关玻璃钢花盆花器广东透光玻璃钢雕塑制作商场美陈粉色云朵库尔勒玻璃钢雕塑舟山高速玻璃钢花盆玻璃钢雕塑鞋带创意玻璃钢雕塑多少钱黑龙江玻璃钢鹿雕塑人物玻璃钢雕塑代理加盟佛像玻璃钢雕塑厂家贵州省玻璃钢雕塑雕塑焦作公园水景玻璃钢景观雕塑公司青岛市玻璃钢人物雕塑报价揭阳动物玻璃钢雕塑创意玻璃钢动物雕塑泸州玻璃钢雕塑摆件施工服务新式的玻璃钢花盆洛阳玻璃钢彩绘雕塑定制果洛玻璃钢雕塑造型香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化