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语言中的UTF-8实现
Apr 26 Golang
Go语言切片前或中间插入项与内置copy()函数详解
Apr 27 Golang
解决Golang time.Parse和time.Format的时区问题
Apr 29 Golang
Go标准容器之Ring的使用说明
May 05 Golang
golang 实用库gotable的具体使用
Jul 01 Golang
基于Go语言构建RESTful API服务
Jul 25 Golang
手把手教你导入Go语言第三方库
Aug 04 Golang
如何利用golang运用mysql数据库
Mar 13 Golang
GO语言字符串处理函数之处理Strings包
Apr 14 Golang
Golang 遍历二叉树
Apr 19 Golang
Golang日志包的使用
Apr 20 Golang
Golang ort 中的sortInts 方法
Apr 24 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面向对象全攻略 (十二) 抽象方法和抽象类
2009/09/30 PHP
php微信公众号开发(3)php实现简单微信文本通讯
2016/12/15 PHP
PHP实现向关联数组指定的Key之前插入元素的方法
2017/06/06 PHP
php实现数组中出现次数超过一半的数字的统计方法
2018/10/14 PHP
PHP unset函数原理及使用方法解析
2020/08/14 PHP
屏蔽F1~F12的快捷键的js函数
2010/05/06 Javascript
javascript自执行函数之伪命名空间封装法
2010/12/25 Javascript
用javascript模仿ie的自动完成类似自动完成功的表单
2012/12/12 Javascript
javascript trim函数在IE下不能用的解决方法
2014/09/12 Javascript
谈谈对offsetleft兼容性的理解
2015/11/11 Javascript
详解javascript遍历方式
2015/11/11 Javascript
Bootstrap Table使用方法详解
2016/08/01 Javascript
JS从数组中随机取出几个数组元素的方法
2016/08/02 Javascript
jQuery弹出下拉列表插件(实现kindeditor的@功能)
2016/08/16 Javascript
分类解析jQuery选择器
2016/11/23 Javascript
移动端H5页面返回并刷新页面(BFcache)的方法
2018/11/06 Javascript
Vue.js 中 axios 跨域访问错误问题及解决方法
2018/11/21 Javascript
jQuery+PHP+Ajax实现动态数字统计展示功能
2019/12/25 jQuery
vue移动端的左右滑动事件详解
2020/06/17 Javascript
[02:27]2018DOTA2亚洲邀请赛赛前采访-OpTic
2018/04/03 DOTA
win7 下搭建sublime的python开发环境的配置方法
2014/06/18 Python
详解Python中find()方法的使用
2015/05/18 Python
Python两个字典键同值相加的几种方法
2019/03/05 Python
Python Opencv实现图像轮廓识别功能
2020/03/23 Python
HTML5的标签的代码的简单介绍 HTML5标签的简介
2012/05/28 HTML / CSS
暇步士官网:Hush Puppies
2016/09/22 全球购物
乐高瑞士官方商店:LEGO CH
2020/08/16 全球购物
解释一下Windows的消息机制
2014/01/30 面试题
大学生标准推荐信范文
2013/11/25 职场文书
中学实习教师自我鉴定
2013/12/12 职场文书
结婚喜宴主持词
2014/03/14 职场文书
文明家庭先进事迹材料
2014/05/14 职场文书
烹饪大赛策划方案
2014/05/26 职场文书
2014司机年终工作总结
2014/12/05 职场文书
党员廉政准则心得体会
2016/01/20 职场文书
CSS 实现多彩、智能的阴影效果
2021/05/12 HTML / CSS