go 原生http web 服务跨域restful api的写法介绍


Posted in Golang onApril 27, 2021

错误写法

func main() {
    openHttpListen()
}
func openHttpListen() {
    http.HandleFunc("/", receiveClientRequest)
    fmt.Println("go server start running...")
    err := http.ListenAndServe(":9090", nil)
    if err != nil {
        log.Fatal("ListenAndServe: ", err)
    }
}
func receiveClientRequest(w http.ResponseWriter, r *http.Request) {
    w.Header().Set("Access-Control-Allow-Origin", "*")             //允许访问所有域
    w.Header().Add("Access-Control-Allow-Headers", "Content-Type") //header的类型
    w.Header().Set("content-type", "application/json")             //返回数据格式是json
    r.ParseForm()
    fmt.Println("收到客户端请求: ", r.Form)

这样还是会报错:

说没有得到响应跨域的头,chrome的network中确实没有响应Access-Control-Allow-Origin

正确写法:

func LDNS(w http.ResponseWriter, req *http.Request) {
    if origin := req.Header.Get("Origin"); origin != "" {
        w.Header().Set("Access-Control-Allow-Origin", origin)
        w.Header().Set("Access-Control-Allow-Methods", "POST, GET, OPTIONS, PUT, DELETE")
        w.Header().Set("Access-Control-Allow-Headers",
            "Accept, Content-Type, Content-Length, Accept-Encoding, X-CSRF-Token, Authorization")
    }
    if req.Method == "OPTIONS" {
        return
    }
    // 响应http code
    w.WriteHeader(200)
    query := strings.Split(req.Host, ".")
    value, err := ldns.RAMDBMgr.Get(query[0])
    fmt.Println("Access-Control-Allow-Origin", "*")
    if err != nil {
        io.WriteString(w, `{"message": ""}`)
        return
    }
    io.WriteString(w, value)
}

补充:go http允许跨域

1.创建中间件

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", 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", "false")
   c.Set("content-type", "application/json")
  }
  if method == "OPTIONS" {
   c.AbortWithStatus(http.StatusNoContent)
  }
  c.Next()
 }
}

2.在route中引用中间件

router := gin.Default()
// 要在路由组之前全局使用「跨域中间件」, 否则OPTIONS会返回404
router.Use(Cors())

以上为个人经验,希望能给大家一个参考,也希望大家多多支持三水点靠木。如有错误或未考虑完全的地方,望不吝赐教。

Golang 相关文章推荐
golang正则之命名分组方式
Apr 25 Golang
解决golang在import自己的包报错的问题
Apr 29 Golang
解决Goland 同一个package中函数互相调用的问题
May 06 Golang
解决goland 导入项目后import里的包报红问题
May 06 Golang
go mod 安装依赖 unkown revision问题的解决方案
May 06 Golang
go select编译期的优化处理逻辑使用场景分析
Jun 28 Golang
Golang的继承模拟实例
Jun 30 Golang
go goroutine 怎样进行错误处理
Jul 16 Golang
手把手教你导入Go语言第三方库
Aug 04 Golang
如何解决goland,idea全局搜索快捷键失效问题
Apr 03 Golang
Golang获取List列表元素的四种方式
Apr 20 Golang
Go语言怎么使用变长参数函数
Jul 15 Golang
解决Golang中ResponseWriter的一个坑
Apr 27 #Golang
golang在GRPC中设置client的超时时间
golang http使用踩过的坑与填坑指南
Apr 27 #Golang
Golang 实现超大文件读取的两种方法
Apr 27 #Golang
golang中的空slice案例
Apr 27 #Golang
Go语言切片前或中间插入项与内置copy()函数详解
golang中切片copy复制和等号复制的区别介绍
Apr 27 #Golang
You might like
简单的方法让你的后台登录更加安全(php中加session验证)
2012/08/22 PHP
JavaScript 拾漏补遗
2009/12/27 Javascript
表头固定(利用jquery实现原理介绍)
2012/11/08 Javascript
easyui datagrid 键盘上下控制选中行示例
2014/03/31 Javascript
JavaScript也谈内存优化
2014/06/06 Javascript
$(document).ready(function() {})不执行初始化脚本
2014/06/19 Javascript
jquery实现焦点图片随机切换效果的方法
2015/03/12 Javascript
JavaScript改变CSS样式的方法汇总
2015/05/07 Javascript
jQuery实现倒计时重新发送短信验证码功能示例
2017/01/12 Javascript
javascript+html5+css3自定义提示窗口
2017/06/21 Javascript
JS自定义滚动条效果简单实现代码
2020/10/27 Javascript
Three.js入门之hello world以及如何绘制线
2017/09/25 Javascript
详解Vue 事件修饰符capture 的使用
2017/12/29 Javascript
webpack4+express+mongodb+vue实现增删改查的示例
2018/11/08 Javascript
json数据格式常见操作示例
2019/06/13 Javascript
[01:02:10]DOTA2上海特级锦标赛B组小组赛#2 VG VS Fnatic第一局
2016/02/26 DOTA
[01:10:03]OG vs EG 2018国际邀请赛淘汰赛BO3 第三场 8.23
2018/08/24 DOTA
在Python中操作字符串之replace()方法的使用
2015/05/19 Python
Mac中升级Python2.7到Python3.5步骤详解
2017/04/27 Python
PyChar学习教程之自定义文件与代码模板详解
2017/07/17 Python
python2.7无法使用pip的解决方法(安装easy_install)
2018/04/03 Python
Python 实现引用其他.py文件中的类和类的方法
2018/04/29 Python
解决新版Pycharm中Matplotlib图像不在弹出独立的显示窗口问题
2019/01/15 Python
Python的高阶函数用法实例分析
2019/04/11 Python
基于Django OneToOneField和ForeignKey的区别详解
2020/03/30 Python
Django执行源生mysql语句实现过程解析
2020/11/12 Python
Html5新标签解释及用法
2012/02/17 HTML / CSS
法国时尚童装网站:Melijoe
2016/08/10 全球购物
求职简历中的自我评价分享
2013/12/08 职场文书
商务英语专业求职信
2014/06/26 职场文书
文明单位申报材料
2014/12/23 职场文书
创业计划书之餐饮
2019/09/02 职场文书
2019员工保密协议书(3篇)
2019/09/23 职场文书
Python机器学习之决策树和随机森林
2021/07/15 Javascript
Go语言入门exec的基本使用
2022/05/20 Golang
Python docx库删除复制paragraph及行高设置图片插入示例
2022/07/23 Python