当前位置: 首页 > news >正文

Gin 框架 解决 跨域问题

Gin 框架解决跨域问题

一点废话

在学习 Axios 的时候发现 up 使用了一个网址来提供 json 数据。因为不想加什么公众号搞啥百度网盘的,然后又刚好会一点点 go,就想着自己用 gin 框架返回一个 json 到前端页面然后从这个页面获取 json

这是我的go代码:

package mainimport ("github.com/gin-gonic/gin"
)func main() {r := gin.Default()r.GET("/test", func(c *gin.Context) {c.JSON(200, gin.H{"id":    "1","name":  "feixin","major": "big data","old":   "20",})})err := r.Run()if err != nil {panic(err)}
}

初学者写的比较low,高手勿喷🥹🥹🥹
下面是我的 html 代码

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Ajax-Axios</title><script src="../js/axios.js"></script></head><body><input type="button" value="GET" onclick="get()"><input type="button" value="POST" onclick="post()">
</body>
<script>function get() {axios({method: "get",url: "http://localhost:8080/test"}).then((result) => {console.log(result.data);})}function post() {}
</script></html>

很简单的基本操作,go 这边实现了 http://localhost:8080/testjson数据,然后 axios 这边从 origin http://127.0.0.1:5500/web/html/test.html 向前者获取 json 数据并打印在 console 中。

运行之后发现出现如下错误:
在这里插入图片描述
bing 之后发现是跨域问题。

这里就不介绍跨域问题了,贴一个佬的讲解。你还不知道跨域问题是怎样造成的吗?


解决方法

反正就大概懂了这个请求我是发成功了,但是因为是 XHR 出现跨域问题 被拦截了,看了这个佬
—传送门— 的文章之后,知道了在 gin 中可以使用中间件来解决这个问题。我的解决步骤如下:

  1. 首先定义一个middlerwares包,新建 go file,任意取名。
    写入以下代码:

    package middlewaresimport ("github.com/gin-gonic/gin""net/http"
    )func Cors() gin.HandlerFunc {return func(c *gin.Context) {method := c.Request.Methodorigin := c.Request.Header.Get("Origin")if origin != "" {c.Header("Access-Control-Allow-Origin", "http://127.0.0.1:5500") // 写入origin的地址,例如我这边是这个c.Header("Access-Control-Allow-Methods", "POST, GET, OPTIONS, PUT, DELETE, UPDATE")c.Header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, Authorization")c.Header("Access-Control-Expose-Headers", "Content-Length, Access-Control-Allow-Origin, Access-Control-Allow-Headers, Cache-Control, Content-Language, Content-Type")c.Header("Access-Control-Allow-Credentials", "true")}if method == "OPTIONS" {c.AbortWithStatus(http.StatusNoContent)}c.Next()}
    }
  2. 然后修改go 代码为:

    package mainimport ("github.com/gin-gonic/gin"middlewares "test.com/helloworld/middlerwares" //多导了这个
    )func main() {r := gin.Default()r.Use(middlewares.Cors()) // 多加了这一句r.GET("/test", func(c *gin.Context) {c.JSON(200, gin.H{"id":    "1","name":  "feixin","major": "big data","old":   "20",})})err := r.Run()if err != nil {panic(err)}
    }
  3. 运行go程序并重新执行 html 代码
    在这里插入图片描述
    点击 GET 成功拿到数据


总结

在javaweb 用 go 语言也是逆天,但是还没有学 springboot 呜呜呜,springboot应该也可以实现类似的操作。总之就是 XHR 产生跨域问题 被目标地址 block了,我们在服务端对 origin 开放一下就可以了。

http://www.lryc.cn/news/167907.html

相关文章:

  • 【Datawhale课程笔记-简单学点大模型】大模型的能力
  • git使用说明
  • 【PowerQuery】PowerBI Pro账户的自动刷新
  • 红黑树(思维导图详解版)
  • javafx学习记录
  • 友善Nona Pi开发板ubuntu22.04系统用Python3.8.17的pip安装PyQt5.15.2时报错“Q_PID”这个宏未定义的一种解决办法
  • HTML中name和class,id的区别和联系
  • Google 开源库Guava详解(集合工具类)—Maps、Multisets、Multimaps
  • 肖sir__mysql之介绍__001
  • 【实战项目开发技术分享】如何设置机器人禁行区/虚拟墙
  • 每日一题~中序后序遍历构造二叉树
  • Sentinel整合Gateway
  • 线性dp,优化,272. 最长公共上升子序列
  • 基于Java+SpringBoot+Vue+uniapp点餐小程序(包含协同过滤算法和会员系统,强烈推荐!)
  • ActiveMQ面试题(二)
  • 解决Oracle SQL语句性能问题——SQL语句改写(in、not in、exists及not exists)
  • 列表对象复制属性到另一个列表对象 从List<Object>另一个List<Object>
  • Python基本情况
  • 【精华】AI Agent:大模型改变世界的“钥匙”
  • CVPR2023 RIFormer, 无需TokenMixer也能达成SOTA性能的极简ViT架构
  • 瑞萨MCU入门教程(非常详细的瑞萨单片机入门教程)
  • 【Java】采用 Tabula 技术对 PDF 文件内表格进行数据提取
  • 完全保密的以太坊交易:Aztec网络的隐私架构
  • 初识Java 9-1 内部类
  • 合宙Air724UG LuatOS-Air LVGL API控件-屏幕横屏竖屏切换(Rotation)
  • 在Unity中,Instantiate函数用于在场景中创建一个新的游戏对象实例
  • 解决 tesserocr报错 Failed to init API, possibly an invalid tessdata path : ./
  • 使用Python CV2融合人脸到新图片--优化版
  • Python分享之对象的属性
  • 编程参考 - std::exchange和std::swap的区别