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 相关文章推荐
Go缓冲channel和非缓冲channel的区别说明
Apr 25 Golang
golang import自定义包方式
Apr 29 Golang
Golang 如何实现函数的任意类型传参
Apr 29 Golang
golang 实现Location跳转方式
May 02 Golang
解决goland 导入项目后import里的包报红问题
May 06 Golang
Golang生成Excel文档的方法步骤
Jun 09 Golang
go开发alertmanger实现钉钉报警
Jul 16 Golang
基于Go语言构建RESTful API服务
Jul 25 Golang
Go中的条件语句Switch示例详解
Aug 23 Golang
Go 通过结构struct实现接口interface的问题
Oct 05 Golang
一文搞懂Golang 时间和日期相关函数
Dec 06 Golang
golang的文件创建及读写操作
Apr 14 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
BBS(php & mysql)完整版(五)
2006/10/09 PHP
php简单浏览目录内容的实现代码
2013/06/07 PHP
php的慢速日志引起的Mysql错误问题分析
2014/05/13 PHP
PHP扩展CURL的用法详解
2014/06/20 PHP
PDO操作MySQL的基础教程(推荐)
2017/08/18 PHP
PHP基于imagick扩展实现合成图片的两种方法【附imagick扩展下载】
2017/11/14 PHP
js下关于onmouseout、事件冒泡的问题经验小结
2010/12/09 Javascript
js如何获取object类型里的键值
2014/02/18 Javascript
jQuery实现统计复选框选中数量
2014/11/24 Javascript
JavaScript自定义等待wait函数实例分析
2015/03/23 Javascript
jquery插件qrcode在线生成二维码
2015/04/26 Javascript
jQuery中设置form表单中action值的实现方法
2016/05/25 Javascript
js插件实现图片滑动验证码
2020/09/29 Javascript
微信小程序倒计时功能实现代码
2017/11/09 Javascript
Vue+webpack项目基础配置教程
2018/02/12 Javascript
小程序转发探索示例
2019/02/19 Javascript
js中offset,client , scroll 三大元素知识点总结
2019/09/11 Javascript
vue+element搭建后台小总结 el-dropdown下拉功能
2020/04/10 Javascript
解决Vue watch里调用方法的坑
2020/11/07 Javascript
Python基础之getpass模块详细介绍
2017/08/10 Python
Django跨域请求问题的解决方法示例
2018/06/16 Python
python try except 捕获所有异常的实例
2018/10/18 Python
python 基于opencv去除图片阴影
2021/01/26 Python
纯CSS3实现鼠标滑过按钮动画第二节
2020/07/16 HTML / CSS
html5仿支付宝密码框的实现代码
2017/09/06 HTML / CSS
详解HTML5如何使用可选样式表为网站或应用添加黑暗模式
2020/04/07 HTML / CSS
STUBHUB日本:购买和出售全球活动门票
2018/07/01 全球购物
Myprotein俄罗斯官网:欧洲第一运动营养品牌
2019/05/05 全球购物
意大利和国际奢侈品牌购物网站:Suitnegozi.com
2021/01/15 全球购物
互联网创业计划书写作技巧攻略
2014/03/23 职场文书
住宅使用说明书
2014/05/09 职场文书
尊老爱亲美德少年事迹材料
2014/08/14 职场文书
精神文明建设先进个人事迹材料
2014/12/24 职场文书
英文导游词
2015/02/13 职场文书
2015年消防工作总结
2015/04/24 职场文书
尊师重教主题班会
2015/08/14 职场文书