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
golang在GRPC中设置client的超时时间
Apr 27 Golang
Goland使用Go Modules创建/管理项目的操作
May 06 Golang
解决golang 关于全局变量的坑
May 06 Golang
go 实现简易端口扫描的示例
May 22 Golang
golang实现一个简单的websocket聊天室功能
Oct 05 Golang
Go语言并发编程 sync.Once
Oct 16 Golang
Go语言读取txt文档的操作方法
Jan 22 Golang
浅谈GO中的Channel以及死锁的造成
Mar 18 Golang
Golang 链表的学习和使用
Apr 19 Golang
GoFrame基于性能测试得知grpool使用场景
Jun 21 Golang
Go微服务项目配置文件的定义和读取示例详解
Jun 21 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
JS与PHP向函数传递可变参数的区别实例代码
2011/05/18 PHP
实现PHP+Mysql无限分类的方法汇总
2015/03/02 PHP
基于linnux+phantomjs实现生成图片格式的网页快照
2015/04/15 PHP
Zend Framework开发入门经典教程
2016/03/23 PHP
微信推送功能实现方式图文详解
2019/07/12 PHP
javascript面向对象的方式实现的弹出层效果代码
2010/01/28 Javascript
一个报数游戏js版(约瑟夫环问题)
2010/08/05 Javascript
node.js平台下利用cookie实现记住密码登陆(Express+Ejs+Mysql)
2017/04/26 Javascript
Angular.js实现动态加载组件详解
2017/05/28 Javascript
vue实现微信分享朋友圈,发送朋友的示例讲解
2018/02/10 Javascript
vue项目中使用ueditor的实例讲解
2018/03/05 Javascript
video.js 实现视频只能后退不能快进的思路详解
2018/08/09 Javascript
Vue全局分页组件的实现代码
2018/08/10 Javascript
基于vue实现圆形菜单栏组件
2019/07/05 Javascript
ES6基础之 Promise 对象用法实例详解
2019/08/22 Javascript
JavaScript中arguments的使用方法详解
2020/12/20 Javascript
Python中的闭包实例详解
2014/08/29 Python
python字典排序实例详解
2015/05/20 Python
python脚本实现xls(xlsx)转成csv
2016/04/10 Python
Python实现的归并排序算法示例
2017/11/21 Python
Flask框架踩坑之ajax跨域请求实现
2019/02/22 Python
python datetime中strptime用法详解
2019/08/29 Python
使用 Python 合并多个格式一致的 Excel 文件(推荐)
2019/12/09 Python
Python hashlib加密模块常用方法解析
2019/12/18 Python
Python基础之函数基本用法与进阶详解
2020/01/02 Python
python3 sorted 如何实现自定义排序标准
2020/03/12 Python
解决c++调用python中文乱码问题
2020/07/29 Python
百思买美国官网:Best Buy
2016/07/28 全球购物
法国和欧洲海边和滑雪度假:Pierre & Vacances
2017/01/04 全球购物
荷兰家电购物网站:Expert.nl
2020/01/18 全球购物
九年级化学教学反思
2014/01/28 职场文书
委托书范本
2014/04/02 职场文书
环保建议书600字
2014/05/14 职场文书
IT工程师岗位职责
2014/07/04 职场文书
“四风”问题整改措施和努力方向
2014/09/20 职场文书
工作失职自我检讨书
2015/05/05 职场文书