这篇文章将为大家详细讲解有关go原生http web服务跨域restful api的写法示例,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。
什么是go
go是golang的简称,golang 是Google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的编程语言,其语法与 C语言相近,但并不包括如枚举、异常处理、继承、泛型、断言、虚函数等功能。
错误写法
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会返回404router.Use(Cors())
关于“go原生http web服务跨域restful api的写法示例”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。