錯誤寫法
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("收到客戶端請求: ", r.Form)
這樣還是會報錯:
說沒有得到響應(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會返回404
router.Use(Cors())
以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。
您可能感興趣的文章:- Django開發(fā)RESTful API實(shí)現(xiàn)增刪改查(入門級)
- Django restful framework生成API文檔過程詳解
- Django JWT Token RestfulAPI用戶認(rèn)證詳解
- Python利用Django如何寫restful api接口詳解
- 詳解Django rest_framework實(shí)現(xiàn)RESTful API
- 詳解Go語言RESTful JSON API創(chuàng)建
- 基于Go語言構(gòu)建RESTful API服務(wù)