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 Gin实现文件上传下载的示例代码
Apr 02 Golang
golang中实现给gif、png、jpeg图片添加文字水印
Apr 26 Golang
golang http使用踩过的坑与填坑指南
Apr 27 Golang
解决Golang中ResponseWriter的一个坑
Apr 27 Golang
Golang 实现获取当前函数名称和文件行号等操作
May 08 Golang
Golang生成Excel文档的方法步骤
Jun 09 Golang
Go中的条件语句Switch示例详解
Aug 23 Golang
Go语言并发编程 sync.Once
Oct 16 Golang
Golang中channel的原理解读(推荐)
Oct 16 Golang
Go 中的空白标识符下划线
Mar 25 Golang
victoriaMetrics库布隆过滤器初始化及使用详解
Apr 05 Golang
Golang实现可重入锁的示例代码
May 25 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下用rmdir实现删除目录的三种方法小结
2008/04/20 PHP
php 日期时间处理函数小结
2009/12/18 PHP
用PHP实现浏览器点击下载TXT文档的方法详解
2013/06/02 PHP
php过滤所有恶意字符(批量过滤post,get敏感数据)
2014/03/18 PHP
php生成短域名函数
2015/03/23 PHP
判断页面是关闭还是刷新的js代码
2007/01/28 Javascript
JQuery魔力之$("tagName")与selector
2012/03/05 Javascript
javascript中的delete使用详解
2013/04/11 Javascript
nodejs事件的监听与触发的理解分析
2015/02/12 NodeJs
JavaScript常用脚本汇总(一)
2015/03/04 Javascript
jQuery焦点图左右转换效果
2016/12/12 Javascript
理解javascript中的闭包
2017/01/11 Javascript
Ajax异步获取html数据中包含js方法无效的解决方法
2017/02/20 Javascript
JS表格组件神器bootstrap table使用指南详解
2017/04/12 Javascript
详解动画插件wow.js的使用方法
2017/09/13 Javascript
Vue.js项目模板搭建图文教程
2017/09/20 Javascript
基于bootstrap页面渲染的问题解决方法
2018/08/09 Javascript
详解可以用在VS Code中的正则表达式小技巧
2019/05/14 Javascript
[02:26]DOTA2英雄米拉娜基础教程
2013/11/25 DOTA
Python程序设计入门(1)基本语法简介
2014/06/13 Python
Python轻量级ORM框架Peewee访问sqlite数据库的方法详解
2017/07/20 Python
Python实现检测文件MD5值的方法示例
2018/04/11 Python
pycharm的console输入实现换行的方法
2019/01/16 Python
python从list列表中选出一个数和其对应的坐标方法
2019/07/20 Python
简单的Python调度器Schedule详解
2019/08/30 Python
numpy:np.newaxis 实现将行向量转换成列向量
2019/11/30 Python
django ORM之values和annotate使用详解
2020/05/19 Python
基于Python 的语音重采样函数解析
2020/07/06 Python
python 读取yaml文件的两种方法(在unittest中使用)
2020/12/01 Python
PHP开发的一般流程
2013/08/13 面试题
房地产还款计划书
2014/01/10 职场文书
班级入场式解说词
2014/02/01 职场文书
卫生系统先进事迹
2014/05/13 职场文书
2014银行领导班子四风对照检查材料思想汇报
2014/09/25 职场文书
Python的三个重要函数详解
2022/01/18 Python
HttpClient实现表单提交上传文件
2022/08/14 Java/Android