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中semaphore(信号量)源码
Apr 03 Golang
golang日志包logger的用法详解
May 05 Golang
go设置多个GOPATH的方式
May 05 Golang
Golang标准库syscall详解(什么是系统调用)
May 25 Golang
入门学习Go的基本语法
Jul 07 Golang
Go语言实现Base64、Base58编码与解码
Jul 26 Golang
Golang 遍历二叉树
Apr 19 Golang
Golang 实现WebSockets
Apr 24 Golang
Go web入门Go pongo2模板引擎
May 20 Golang
Go gRPC进阶教程gRPC转换HTTP
Jun 16 Golang
Go结合Gin导出Mysql数据到Excel表格
Aug 05 Golang
基于Python实现西西成语接龙小助手
Aug 05 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持久连接mysql_pconnect()函数使用介绍
2012/02/05 PHP
php缩放图片(根据宽高的等比例缩放)实例介绍
2013/06/09 PHP
Zend Framework教程之Zend_Db_Table表关联实例详解
2016/03/23 PHP
CodeIgniter集成smarty的方法详解
2016/05/26 PHP
Thinkphp 框架扩展之应用模式实现方法分析
2020/04/27 PHP
Extjs Ajax 乱码问题解决方案
2009/04/15 Javascript
jquery 新浪网易的评论块制作
2010/07/01 Javascript
Javascript实现关联数据(Linked Data)查询及注意细节
2013/02/22 Javascript
JavaScript代码编写中各种各样的坑和填坑方法
2014/06/06 Javascript
通过js获取上传的图片信息(临时保存路径,名称,大小)然后通过ajax传递给后端的方法
2015/10/01 Javascript
基于JavaScript实现移动端TAB触屏切换效果
2015/10/20 Javascript
常用原生JS兼容性写法汇总
2016/04/27 Javascript
Angular的$http与$location
2016/12/26 Javascript
原生js实现移动端触摸轮播的示例代码
2017/12/22 Javascript
vue将时间戳转换成自定义时间格式的方法
2018/03/02 Javascript
解决vue处理axios post请求传参的问题
2018/03/05 Javascript
JS实现动态生成html table表格的方法分析
2018/07/11 Javascript
vue.js实现会动的简历(包含底部导航功能,编辑功能)
2019/04/08 Javascript
Javascript新手入门之字符串拼接与变量的应用
2020/12/03 Javascript
[05:06]TI4西雅图DOTA2前线报道 海涛密探LGD训练
2014/07/09 DOTA
python实现socket端口重定向示例
2014/02/10 Python
python中range()与xrange()用法分析
2016/09/21 Python
详解使用PyInstaller将Pygame库编写的小游戏程序打包为exe文件
2019/08/23 Python
Python的垃圾回收机制详解
2019/08/28 Python
Python识别处理照片中的条形码
2020/11/16 Python
Python系统公网私网流量监控实现流程
2020/11/23 Python
英国最大的汽车配件在线商店:Euro Car Parts
2019/09/30 全球购物
公务员综合考察材料
2014/02/01 职场文书
推荐信格式范文
2014/05/09 职场文书
孝敬父母的活动方案
2014/08/28 职场文书
小学教师先进事迹材料
2014/12/15 职场文书
2015年全国保险公众宣传日活动方案
2015/05/06 职场文书
楚门的世界观后感
2015/06/03 职场文书
《搭石》教学反思
2016/02/18 职场文书
MySQL pt-slave-restart工具的使用简介
2021/04/07 MySQL
python 如何在list中找Topk的数值和索引
2021/05/20 Python