axios如何跨域请求_前端跨域请求

axios如何跨域请求_前端跨域请求axios跨域请求详情写这篇文章的背景是因为之前遇到的,在跨域的情况下通过axios发起的get请求正常,post请求会在正式请求发送之前先发送一个opstions请求,而后端接口没有兼容options,导致404的情况。而在解决这个问题时带着好奇心顺带查了一下,给自己补充了些知识点跨域请求分两种简单讲,从JavaScript代码发起的XMLHttpRequest请求可以分为两种:不会触发CORS预检的请求,而是直接向服务端发送请求,什么是CORS预检咱们后面

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

axios 跨域请求详情

写这篇文章的背景是因为之前遇到的,在跨域的情况下通过 axios 发起的 get 请求正常,post 请求会在正式请求发送之前先发送一个 opstions 请求,而后端接口没有兼容 options,导致 404 的情况。
而在解决这个问题时带着好奇心顺带查了一下,给自己补充了些知识点

跨域请求分两种

简单讲,

JavaScript 代码发起的 XMLHttpRequest 请求可以分为两种:
不会触发CORS预检的请求,而是直接向服务端发送请求,什么是 CORS预检 咱们后面说,其匹配的规则大致如下:
1. 请求方法为 GET、 HEAD、 POST 中的一种
2. CORS安全部首字段在以下集合中:
ACCEPT
Accept-Language
Content-Language
DPR
Downlink
Save-Data
Viewport-Width
Width
Content-Type (值仅限text/plain,multipart/form-data,application/x-www-form-urlencoded)

3. 请求中的XMLHttpRequestUpload 对象没有注册任何事件监听
4. 请求中没有ReadableStream对象

预检请求:

在发送正式请求之前,会先发起一个 OPTIONS 预检请求到服务器,以获知服务器是否允许该实际请求,若不允许,则不再发送请求,其匹配规则如下:

1 请求方法为:PUT、 DELETE、 CONNECT、 OPTIONS、 TRACE、 PATCH 之一
2 人为设置了 CORS安全部首字段集合 之外的字段
3 请求中的 XMLHttpRequestUpload 对象注册了任意事件监听器
4 请求中使用了 ReadableStream 对象

在跨域请求中,若服务端返回了正确的跨域响应部首:Access-Control-Allow-Origin、Access-Control-Allow-Method、Access-Control-Allow-Headers, 则跨域请求能正常获取数据。

问题解决:

根据以上了解的知识点,跟进遇到的问题,发现 axios 的请求部首 Content-Type 的值默认为 application/json;charset=utf-8,且 POST 请求数据为 json 格式,故进行 POST 请求会先发出预检请求,若服务端对预检请求的响应为不支持,则请求终止。
根据上面分析出的原因,以下列举两种解决方案:

完善服务端接口及跨域响应部首

跨域时将请求转换为简单请求:

请求部首的 Content-Type 设为 application/x-www-form-urlencoded
处理 POST 请求数据,方式有以下两种:
1 通过 URLSearchParams 生成POST 请求的数据
2 使用 qs 库的 stringify api 对请求数据进行转换(若请求数据中某个字段的值为引用类型,需要先通过 3 JSON.stringify 处理,以防止服务端无法识别)

例子
/* 通过 qs 模块处理请求数据*/
import axios from 'axios'
import qs from 'qs'

axios.defaults.withCredentials = true // 若跨域请求需要带 cookie 身份识别
axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded'

// 请求拦截器
axios.interceptors.request.use(req => { 
   
    // 对 post 请求数据进行处理
    if (req.method === 'post') { 
   
        Object.keys(req.data).forEach(item => { 
   
            !isPrimeval(req.data[item]) && (req.data[item] = JSON.stringify(req.data[item]))
        })
        req.data = qs.stringify(req.data)
    }
    return req
}, error => { 
   
    // 请求出错时处理
    return Promise.reject(error)
})

or

/* 通过 URLSearchParams 生成 POST 请求数据 */
import axios from 'axios'

async function anInterface (url, params = { 
   }) { 
   
    let data = new URLSearchParams()
    for(let key in params) { 
   
        data.append(params[key])
    }
    const res = await axios.post(url, data)

    // 处理数据
    
    return res.data
}

通过以上方式即可将 POST 预检请求转换为简单请求,其好处不言而喻,对于多个 POST 请求而言,可以减少一半的请求数量,且在一些服务端比较不能改动的场景更为适用

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/194926.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Android+jacoco实现代码覆盖率最正确的实现方式,没有之一!

    Android+jacoco实现代码覆盖率最正确的实现方式,没有之一!前言:jacoco是JavaCodeCoverage的缩写,是Java代码覆盖率统计的主流工具之一。关于jacoco的原理介绍的文章在网上有很多,感兴趣的同学可以去找别的博客看看,我这里不做赘述。它的作用是在安卓项目的代码覆盖率统计使用了jacoco的离线插桩方式,在测试前先对文件进行插桩,然后生成插过桩的class或jar包,测试(单元测试、UI测试或者手工测试等)插过桩的class和jar包后,会生成动态覆盖信息到文件,最后统一对覆盖信息进行处理,并生成报告。在我接到这个需求,需要统计开发人.

    2022年7月20日
    14
  • java pdf 转 word_PDF怎么转换成Word,免费,完整的那种

    java pdf 转 word_PDF怎么转换成Word,免费,完整的那种简介PDF可以分为文字型PDF和图片型PDF,文字型PDF即可以选中文字内容的PDF,反之图片型PDF即无法选中文字的PDF,其内容实际上是图片。本文针对不同类型,介绍PDF转Word方法,可以说是目前的最优解,没有之一。文字型PDF转Word方法1-直接用Word打开优点简单方便缺点部分样式丢失,排版错位,转换并不完美部分文件会有乱码无法识别图片型PDF里的文字总结适合对样式不敏感,主要关心正文…

    2022年4月30日
    56
  • linux 实现不同网段网络互通[通俗易懂]

    linux 实现不同网段网络互通[通俗易懂]实现:网络:10.10.100.0/24网络:172.16.100.0/24网络:192.168.10.0/24server1:10.10.100.128/24server2:172.16.100.132/24server3:192.168.10.131/24server4:10.10.100.129/24172.16.100.133/24192.168.10.132/24在linux中实现网络互通实现不通网段的网络互通需要借助net-tools所以首先在每个设备上需要安装

    2025年10月31日
    4
  • 无法定位序数10于动态链接库crt.dll_无法定位序数3883于动态链接库

    无法定位序数10于动态链接库crt.dll_无法定位序数3883于动态链接库问题阐述:开发环境:VS2008使用RELEASE生成了可执行文件,发如今某些电脑上能够正常执行,但在部分电脑中执行失败提示:无法定位序数8523于动态链接库mfc90.dll在网上查找了一些资料

    2022年8月4日
    8
  • 怎么看idea是否激活_最新在线免费激活

    (怎么看idea是否激活)好多小伙伴总是说激活码老是失效,太麻烦,关注/收藏全栈君太难教程,2021永久激活的方法等着你。IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.htmlCJM5ZJBPHS-eyJsaWNlbnNlSWQi…

    2022年3月31日
    81
  • 研华acdp手机版_研华acdp值得购买吗

    研华acdp手机版_研华acdp值得购买吗你准备游览一个公园,该公园由 N 个岛屿组成,当地管理部门从每个岛屿出发向另外一个岛屿建了一座桥,不过桥是可以双向行走的。同时,每对岛屿之间都有一艘专用的往来两岛之间的渡船。相对于乘船而言,你更喜欢步行。你希望所经过的桥的总长度尽可能的长,但受到以下的限制:可以自行挑选一个岛开始游览。任何一个岛都不能游览一次以上。无论任何时间你都可以由你现在所在的岛 S 去另一个你从未到过的岛 D。由 S 到 D 可以有以下方法:(1)步行:仅当两个岛之间有一座桥时才有可能。对于这种情况,桥的长度会累加到你步

    2022年8月11日
    5

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号