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 08 Golang
Golang 如何实现函数的任意类型传参
Apr 29 Golang
解决goland 导入项目后import里的包报红问题
May 06 Golang
Golang全局变量加锁的问题解决
May 08 Golang
Go中的条件语句Switch示例详解
Aug 23 Golang
Go 语言中 20 个占位符的整理
Oct 16 Golang
Golang流模式之grpc的四种数据流
Apr 13 Golang
Golang 对es的操作实例
Apr 20 Golang
Golang日志包的使用
Apr 20 Golang
Golang jwt身份认证
Apr 20 Golang
Go gRPC进阶教程gRPC转换HTTP
Jun 16 Golang
Go语言测试库testify使用学习
Jul 23 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
给apache2.2加上mod_encoding模块後 php5.2.0 处理url出现bug
2007/04/12 PHP
10个简化PHP开发的工具
2014/12/25 PHP
php计划任务之验证是否有多个进程调用同一个job的方法
2015/12/07 PHP
composer.lock文件的作用
2016/02/03 PHP
PHP生成各种随机验证码的方法总结【附demo源码】
2017/06/05 PHP
在IE 浏览器中使用 jquery的fadeIn() 效果 英文字符字体加粗
2011/06/02 Javascript
Js sort排序使用方法
2011/10/17 Javascript
jquery实现metro效果示例代码
2013/09/06 Javascript
解析jQuery的三种bind/One/Live事件绑定使用方法
2013/12/30 Javascript
Asp.Net alert弹出提示信息的几种方法总结
2014/01/29 Javascript
点击A元素触发B元素的事件在IE8下会识别成A元素
2014/09/04 Javascript
jQuery中extend()和fn.extend()方法详解
2015/06/03 Javascript
javascript解决IE6下hover问题的方法
2015/07/28 Javascript
javascript禁止超链接跳转的方法
2016/02/02 Javascript
js实现添加可信站点、修改activex安全设置,禁用弹出窗口阻止程序
2016/08/17 Javascript
javascript设计模式之模块模式学习笔记
2017/02/15 Javascript
angularjs点击图片放大实现上传图片预览
2017/02/24 Javascript
Vue实现动态显示textarea剩余字数
2017/05/22 Javascript
Angular模板表单校验方法详解
2017/08/11 Javascript
vue组件实现文字居中对齐的方法
2017/08/23 Javascript
Web技术实现移动监测的介绍
2017/09/18 Javascript
自己动手封装一个React Native多级联动
2018/09/19 Javascript
基于vue通用表单解决方案的思考与分析
2019/03/16 Javascript
基于Vue 实现一个中规中矩loading组件
2019/04/03 Javascript
JavaScript函数式编程(Functional Programming)箭头函数(Arrow functions)用法分析
2019/05/22 Javascript
js实现简单的贪吃蛇游戏
2020/04/23 Javascript
编写Python的web框架中的Model的教程
2015/04/29 Python
深入理解python中的浅拷贝和深拷贝
2016/05/30 Python
python字符串循环左移
2019/03/08 Python
Pycharm连接远程服务器过程图解
2020/04/30 Python
pycharm软件实现设置自动保存操作
2020/06/08 Python
毕业生毕业总结的自我评价范文
2013/11/02 职场文书
个人现实表现材料
2014/02/04 职场文书
销售顾问工作计划书
2014/08/15 职场文书
高三生物教学反思
2016/02/22 职场文书
Python破解极验滑动验证码详细步骤
2021/05/21 Python