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 实现菜单树的生成方式
Apr 28 Golang
go结构体嵌套的切片数组操作
Apr 28 Golang
golang gopm get -g -v 无法获取第三方库的解决方案
May 05 Golang
go web 预防跨站脚本的实现方式
Jun 11 Golang
浅谈GO中的Channel以及死锁的造成
Mar 18 Golang
golang连接MySQl使用sqlx库
Apr 14 Golang
golang语言指针操作
Apr 14 Golang
Golang 对es的操作实例
Apr 20 Golang
Golang解析JSON对象
Apr 30 Golang
GoFrame基于性能测试得知grpool使用场景
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
用PHPdig打造属于你自己的Google[图文教程]
2007/02/14 PHP
PHP中基本符号及使用方法
2010/03/23 PHP
php file_exists 检查文件或目录是否存在的函数
2010/05/10 PHP
php实现根据url自动生成缩略图的方法
2014/09/23 PHP
php校验表单检测字段是否为空的方法
2015/03/20 PHP
PHP常见的6个错误提示及解决方法
2016/07/07 PHP
php数值计算num类简单操作示例
2020/05/15 PHP
对YUI扩展的Gird组件 Part-2
2007/03/10 Javascript
Javascript 面向对象 重载
2010/05/13 Javascript
windows系统下简单nodejs安装及环境配置
2013/01/08 NodeJs
javascript的变量、传值、传址、参数之间关系
2015/07/26 Javascript
zTree插件下拉树使用入门教程
2016/04/11 Javascript
jQuery javascript获得网页的高度与宽度的实现代码
2016/04/26 Javascript
jQuery实现两个select控件的互移操作
2016/12/22 Javascript
Vue.js实现一个漂亮、灵活、可复用的提示组件示例
2017/03/17 Javascript
es6学习笔记之Async函数基本教程
2017/05/11 Javascript
nodejs微信扫码支付功能实现
2018/02/17 NodeJs
在vscode中统一vue编码风格的方法
2018/02/22 Javascript
Intellij IDEA搭建vue-cli项目的方法步骤
2018/10/20 Javascript
微信小程序设置滚动条过程详解
2019/07/25 Javascript
javascript实现简单搜索功能
2020/03/26 Javascript
详解elementUI中input框无法输入的问题
2020/04/27 Javascript
原生js实现滑块区间组件
2021/01/20 Javascript
django自定义Field实现一个字段存储以逗号分隔的字符串
2014/04/27 Python
python中List的sort方法指南
2014/09/01 Python
Python PyQt5 Pycharm 环境搭建及配置详解(图文教程)
2019/07/16 Python
Python类反射机制使用实例解析
2019/12/30 Python
英国最大的体育&时尚零售公司:JD Sports
2017/12/13 全球购物
英国简约舒适女装品牌:Great Plains
2018/07/27 全球购物
类、抽象类、接口的差异
2016/06/13 面试题
Java如何支持I18N?
2016/10/31 面试题
大学生军训自我评价分享
2013/11/09 职场文书
酒店出纳岗位职责
2013/12/29 职场文书
交通事故协议书范本
2014/11/18 职场文书
2015年六年级班主任工作总结
2015/10/15 职场文书
pytorch 中autograd.grad()函数的用法说明
2021/05/12 Python