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如何去除多余空白字符(含制表符)
Apr 25 Golang
解决Go gorm踩过的坑
Apr 30 Golang
Golang二维数组的使用方式
May 28 Golang
Go 语言下基于Redis分布式锁的实现方式
Jun 28 Golang
golang 实用库gotable的具体使用
Jul 01 Golang
Go语言基础函数基本用法及示例详解
Nov 17 Golang
一文搞懂Golang 时间和日期相关函数
Dec 06 Golang
golang操作rocketmq的示例代码
Apr 06 Golang
golang三种设计模式之简单工厂、方法工厂和抽象工厂
Apr 10 Golang
golang的文件创建及读写操作
Apr 14 Golang
Golang获取List列表元素的四种方式
Apr 20 Golang
GO中sync包自由控制并发示例详解
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+ajaxfileupload+jcrop插件完美实现头像上传剪裁
2014/06/09 PHP
Joomla简单判断用户是否登录的方法
2016/05/04 PHP
PHP pthreads v3使用中的一些坑和注意点分析
2020/02/21 PHP
jQuery表格行换色的三种实现方法
2011/06/27 Javascript
jquery简单实现滚动条下拉DIV固定在头部不动
2013/11/25 Javascript
jQuery的live()方法对hover事件的处理示例
2014/02/27 Javascript
JS选项卡动态替换banner图片路径的方法
2015/05/11 Javascript
javascript实现别踩白块儿小游戏程序
2015/11/22 Javascript
JQuery给select添加/删除节点的实现代码
2016/04/26 Javascript
JS给swf传参数的实现方法
2016/09/13 Javascript
AngularJS通过$http和服务器通信详解
2016/09/21 Javascript
jQuery插件echarts实现的去掉X轴、Y轴和网格线效果示例【附demo源码下载】
2017/03/04 Javascript
JS排序之选择排序详解
2017/04/08 Javascript
如何在AngularJs中调用第三方插件库
2017/05/21 Javascript
Form表单上传文件(type="file")的使用
2017/08/03 Javascript
关于vue.js发布后路径引用的问题解决
2017/08/15 Javascript
iview table高度动态设置方法
2018/03/14 Javascript
vue.js打包之后可能会遇到的坑!
2018/06/03 Javascript
JS使用Prim算法和Kruskal算法实现最小生成树
2019/01/17 Javascript
ES6 Object.assign()的用法及其使用
2020/01/18 Javascript
JS深入学习之数组对象排序操作示例
2020/05/01 Javascript
详解小程序横屏方案对比
2020/06/28 Javascript
在Python下使用Txt2Html实现网页过滤代理的教程
2015/04/11 Python
Python实现批量转换文件编码的方法
2015/07/28 Python
Python 实现简单的电话本功能
2015/08/09 Python
python实现顺序表的简单代码
2018/09/28 Python
Kenneth Cole官网:纽约时尚优雅品牌
2016/11/14 全球购物
介绍一下gcc特性
2012/01/20 面试题
探矿工程师自荐信
2014/01/24 职场文书
元旦联欢会感言
2014/03/04 职场文书
3的组成教学反思
2014/04/30 职场文书
公司法人授权委托书范本
2014/09/12 职场文书
党员检讨书
2014/10/13 职场文书
创业计划书之干洗店
2019/09/10 职场文书
python爬取网页版QQ空间,生成各类图表
2021/06/02 Python
利用Pycharm连接服务器的全过程记录
2021/07/01 Python