Gin 框架 解决 跨域问题

Gin 框架解决跨域问题

一点废话

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

这是我的go代码:

go 复制代码
package main

import (
	"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 代码

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,任意取名。

    写入以下代码:

    go 复制代码
    package middlewares
    
    import (
    	"github.com/gin-gonic/gin"
    	"net/http"
    )
    
    func Cors() gin.HandlerFunc {
    	return func(c *gin.Context) {
    		method := c.Request.Method
    		origin := 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 代码为:

    go 复制代码
    package main
    
    import (
    	"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 开放一下就可以了。

相关推荐
你很易烊千玺3 小时前
日常练习-数组 字符串常用的场景
前端·javascript·字符串·数组
存在的五月雨4 小时前
Vue3项目一些语法
前端·javascript·react.js
lolo大魔王4 小时前
Go 后端实战|Gin + GORM V2 + MySQL 企业级 API 项目开发(完整版)
mysql·golang·gin
大家的林语冰4 小时前
Node 2026 发布,JS 三大新功能上线,最后一个奇偶版本
前端·javascript·node.js
三*一5 小时前
Mapbox GL JS 自研面要素整形工具开发实录
开发语言·javascript·arcgis·ecmascript
我的世界洛天依5 小时前
胡桃讲编程|续篇!用高数 + JS ES262 硬核解构:求乐正绫的值
javascript
棉猴6 小时前
python海龟绘图之画布与窗口
javascript·python·html·setup·turtle·海龟绘图·screensize
AI_paid_community6 小时前
25k Star 登顶 GitHub:这个专门吃 K 线图长大的 AI,让我意识到之前三年都在裸奔
javascript·claude
gjwjuejin8 小时前
前端埋点第二弹:那些年我们踩过的坑,和填坑的正确姿势
javascript