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

相关推荐
爱吃无爪鱼2 分钟前
01-前端开发快速入门路线图
javascript·css·vue.js·typescript·前端框架·npm·node.js
脾气有点小暴9 分钟前
uniapp通用单张图片上传组件
前端·javascript·vue.js·uni-app·uniapp
老华带你飞24 分钟前
茶叶商城|基于SprinBoot+vue的茶叶商城系统(源码+数据库+文档)
java·前端·javascript·数据库·vue.js·spring boot
涔溪30 分钟前
Vue3常用的组合式API 超详细讲解
前端·javascript·vue.js
一水鉴天43 分钟前
整体设计 定稿 之20 拼语言表述体系之3 dashboard.html完整代码
java·前端·javascript
一颗烂土豆43 分钟前
React 大屏可视化适配方案:vfit-react 发布 🚀
前端·javascript·react.js
加洛斯1 小时前
箭头函数的艺术:如何优雅的写好JS代码
前端·javascript
克喵的水银蛇1 小时前
Flutter 自定义 Widget 实战:封装通用按钮 + 下拉刷新列表
前端·javascript·flutter
艾体宝IT1 小时前
艾体宝干货 | Redis Java 开发系列#2 数据结构
javascript
一颗不甘坠落的流星1 小时前
【@ebay/nice-modal-react】管理React弹窗(Modal)状态
前端·javascript·react.js