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中的空slice案例
Apr 27 Golang
Go语言中break label与goto label的区别
Apr 28 Golang
解决golang在import自己的包报错的问题
Apr 29 Golang
go类型转换及与C的类型转换方式
May 05 Golang
go xorm框架的使用
May 22 Golang
Go语言空白表示符_的实例用法
Jul 04 Golang
K8s部署发布Golang应用程序的实现方法
Jul 16 Golang
golang 语言中错误处理机制
Aug 30 Golang
Go语言grpc和protobuf
Apr 13 Golang
Golang 链表的学习和使用
Apr 19 Golang
Golang map映射的用法
Apr 22 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实现短信验证码接口(容联运通讯)
2016/09/06 PHP
PHP抓取远程图片(含不带后缀的)教程详解
2016/10/21 PHP
windows环境下使用Composer安装ThinkPHP5
2018/05/18 PHP
php中file_get_contents()函数用法实例
2019/02/21 PHP
用js实现预览待上传的本地图片
2007/03/15 Javascript
使用Jquery来实现可以输入值的下拉选单 雏型
2011/12/06 Javascript
js模拟点击以提交表单为例兼容主流浏览器
2013/11/29 Javascript
node.js中的http.response.write方法使用说明
2014/12/14 Javascript
关于Javascript加载执行优化的研究报告
2014/12/16 Javascript
JS数组合并push与concat区别分析
2015/12/17 Javascript
JavaScript统计字符串中每个字符出现次数完整实例
2016/01/28 Javascript
深入理解ECMAScript的几个关键语句
2016/06/01 Javascript
vue实现添加标签demo示例代码
2017/01/21 Javascript
JS实现图片点击后出现模态框效果
2017/05/03 Javascript
原生JS实现日历组件的示例代码
2017/09/22 Javascript
利用js编写网页进度条效果
2017/10/08 Javascript
JS实现标签滚动切换效果
2017/12/25 Javascript
详解webpack自定义loader初探
2018/08/29 Javascript
解决Idea、WebStorm下使用Vue cli脚手架项目无法使用Webpack别名的问题
2019/10/11 Javascript
vue-cli+iview项目打包上线之后图标不显示问题及解决方法
2019/10/16 Javascript
JavaScript实现轮播图片完整代码
2020/03/07 Javascript
一个简单的python程序实例(通讯录)
2013/11/29 Python
Python装饰器用法实例总结
2018/05/26 Python
对Pytorch中nn.ModuleList 和 nn.Sequential详解
2019/08/18 Python
Python下载的11种姿势(小结)
2020/11/18 Python
利用CSS3实现开门效果实例源码
2016/08/22 HTML / CSS
美国护肤咨询及美容产品电商:Askderm
2017/02/24 全球购物
 Alo Yoga官网:购买瑜伽服装
2018/06/17 全球购物
新闻网站实习自我鉴定
2013/09/25 职场文书
道德之星事迹材料
2014/05/03 职场文书
党员活动日总结
2014/05/05 职场文书
医生个人年终总结
2015/02/28 职场文书
公司清洁工岗位职责
2015/04/15 职场文书
初三毕业感言
2015/07/31 职场文书
先进个人事迹材料(2016推荐版)
2016/03/01 职场文书
《月歌。》宣布制作10周年纪念剧场版《RABBITS KINGDOM THE MOVIE》
2022/04/02 日漫