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语言map与string的相互转换的实现
Apr 07 Golang
基于go interface{}==nil 的几种坑及原理分析
Apr 24 Golang
golang通过递归遍历生成树状结构的操作
Apr 28 Golang
Go语言中break label与goto label的区别
Apr 28 Golang
浅谈golang package中init方法的多处定义及运行顺序问题
May 06 Golang
Go 自定义package包设置与导入操作
May 06 Golang
Golang全局变量加锁的问题解决
May 08 Golang
go select编译期的优化处理逻辑使用场景分析
Jun 28 Golang
Go语言实现Base64、Base58编码与解码
Jul 26 Golang
Golang日志包的使用
Apr 20 Golang
在ubuntu下安装go开发环境的全过程
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编程最快明白》第三讲:php数组
2010/11/01 PHP
laravel 5 实现模板主题功能
2015/03/02 PHP
PHP微信开发之微信消息自动回复下所遇到的坑
2016/05/09 PHP
PHP实现无限分类的实现方法
2016/11/14 PHP
iis6手工创建网站后无法运行php脚本的解决方法
2017/06/08 PHP
jQuery 1.3 和 Validation 验证插件1.5.1
2009/07/09 Javascript
jquery1.5.1中根据元素ID获取元素对象的代码
2011/04/02 Javascript
JavaScript异步编程:异步数据收集的具体方法
2013/08/19 Javascript
Javascript Objects详解
2014/09/04 Javascript
jQuery添加和删除指定标签的方法
2015/12/16 Javascript
js实现简单的省市县三级联动效果实例
2016/02/18 Javascript
总结JavaScript三种数据存储方式之间的区别
2016/05/03 Javascript
jQuery动态生成表格及右键菜单功能示例
2017/01/13 Javascript
使用jQuery卸载全部事件的思路详解
2017/04/03 jQuery
JS中的多态实例详解
2017/10/15 Javascript
Angular4学习笔记router的简单使用
2018/03/30 Javascript
js实现导航跟随效果
2018/11/17 Javascript
jquery 遍历hash操作示例【基于ajax交互】
2019/10/12 jQuery
vue监听键盘事件的相关总结
2021/01/29 Vue.js
Linux下使用python自动修改本机网关代码分享
2015/05/21 Python
Python彩色化Linux的命令行终端界面的代码实例分享
2016/07/02 Python
Python学习笔记之if语句的使用示例
2017/10/23 Python
Python中import机制详解
2017/11/14 Python
Django数据库类库MySQLdb使用详解
2019/04/28 Python
Python进度条的制作代码实例
2019/08/31 Python
用Python 爬取猫眼电影数据分析《无名之辈》
2020/07/24 Python
python 如何在测试中使用 Mock
2021/03/01 Python
美国波道夫·古德曼百货官网:Bergdorf Goodman
2017/11/07 全球购物
欧洲最大的高尔夫零售商:American Golf
2019/09/02 全球购物
2014年高中班主任工作总结
2014/11/08 职场文书
销售合作意向书范本
2015/05/08 职场文书
盗窃案辩护词
2015/05/21 职场文书
2019最新企业员工考勤管理制度(通用版)!
2019/07/02 职场文书
SQL IDENTITY_INSERT作用案例详解
2021/08/23 MySQL
解决pycharm下载库时出现Failed to install package的问题
2021/09/04 Python
Python保存并浏览用户的历史记录
2022/04/29 Python