前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >axios如何跨域请求_前端跨域请求

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

作者头像
全栈程序员站长
发布2022-10-01 13:18:43
发布2022-10-01 13:18:43
3.2K00
代码可运行
举报
运行总次数:0
代码可运行

大家好,又见面了,我是你们的朋友全栈君。

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 处理,以防止服务端无法识别)

例子
代码语言:javascript
代码运行次数:0
运行
复制
/* 通过 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.cn/194926.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年9月11日 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • axios 跨域请求详情
    • 跨域请求分两种
    • 简单讲,
    • 预检请求:
    • 问题解决:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档