go 原生http web 服務(wù)跨域restful api的寫法介紹
更新時(shí)間:2021年04月27日 14:55:36 作者:過兒9973
這篇文章主要介紹了go 原生http web 服務(wù)跨域restful api的寫法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
錯(cuò)誤寫法
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") //返回?cái)?shù)據(jù)格式是json r.ParseForm() fmt.Println("收到客戶端請(qǐng)求: ", r.Form)
這樣還是會(huì)報(bào)錯(cuò):
說沒有得到響應(yīng)跨域的頭,chrome的network中確實(shí)沒有響應(yīng)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 } // 響應(yīng)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) }
補(bǔ)充:go http允許跨域
1.創(chuàng)建中間件
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會(huì)返回404 router.Use(Cors())
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。
相關(guān)文章
VSCode1.4 搭建Golang的開發(fā)調(diào)試環(huán)境(遇到很多問題)
這篇文章主要介紹了VSCode1.4 搭建Golang的開發(fā)調(diào)試環(huán)境(遇到很多問題),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04利用go語言實(shí)現(xiàn)查找二叉樹中的最大寬度
這篇文章主要介紹了利用go語言實(shí)現(xiàn)查找二叉樹中的最大寬度,文章圍繞主題展開詳細(xì)介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-05-05Golang當(dāng)中的定時(shí)器實(shí)例詳解
這篇文章主要給大家介紹了關(guān)于Golang當(dāng)中定時(shí)器的相關(guān)資料,定時(shí)器的實(shí)現(xiàn)大家應(yīng)該都遇到過,最近在學(xué)習(xí)golang,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-07-07HTTP服務(wù)壓力測(cè)試工具及相關(guān)術(shù)語講解
這篇文章主要為大家介紹了HTTP服務(wù)壓力測(cè)試工具使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪2022-04-04