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 开放一下就可以了。

相关推荐
就改了6 分钟前
Ajax——在OA系统提升性能的局部刷新
前端·javascript·ajax
凌冰_8 分钟前
Ajax 入门
前端·javascript·ajax
奋飛32 分钟前
TypeScript系列:第六篇 - 编写高质量的TS类型
javascript·typescript·ts·declare·.d.ts
sunbyte40 分钟前
50天50个小项目 (Vue3 + Tailwindcss V4) ✨ | ThemeClock(主题时钟)
前端·javascript·css·vue.js·前端框架·tailwindcss
小飞悟1 小时前
🎯 什么是模块化?CommonJS 和 ES6 Modules 到底有什么区别?小白也能看懂
前端·javascript·设计
浏览器API调用工程师_Taylor1 小时前
AOP魔法:一招实现登录弹窗的全局拦截与动态处理
前端·javascript·vue.js
FogLetter1 小时前
初识图片懒加载:让网页像"懒人"一样聪明加载
前端·javascript
呆呆的心1 小时前
JavaScript 深入理解闭包与柯里化:从原理到实践 🚀
javascript·面试
快起来别睡了1 小时前
看完这篇文章,你就知道什么是proxy
javascript
请你吃div1 小时前
JavaScript 实用函数大全(超实用)
前端·javascript·面试