|
我已经创建了旅行服务器。它工作正常,我们可以POST通过 Insomnia但是当我们发出请求时,POST通过过前端axios当发出请求时,它会发送一个错误:
5 ?- B5 [ Y0 I: T5 Z: V3 u. whas been blocked by CORS policy: Response to preflight request doesn’t pass access control check: It does not have HTTP ok status.* K- G4 \) K8 @
我们对 axios 的要求:" c- F( y) {# \( Y$ P9 D
let config = {headers: { "Content-Type": "application/json", 'Access-Control-Allow-Origin': '*', }}let data = { "id": 4 } axios.post('http://196.121.147.69:9777/twirp/route.FRoute/GetLists',data,config) .then((res) => { console.log(res) .catch((err) => { console.log(err) });}
# @( A) q. R7 g2 i- |$ [; L 我的去文件:
! M) T; B1 I5 P5 v; Nfunc setupResponse(w *http.ResponseWriter,req *http.Request) (*w).Header().Set("Access-Control-Allow-Origin","*") (*w).Header().Set("Access-Control-Allow-Methods"," OST,GET,OPTIONS,PUT,DELETE") (*w).Header().Set("Access-Control-Allow-Headers","Accept,Content-Type,Content-Length,Accept-Encoding,X-CSRF-Token,Authorization")}func WithUserAgent(base http.Handler) http.Handler return http.HandlerFunc(func(w http.ResponseWriter,r *http.Request) ctx := r.Context() ua := r.Header.Get("Jwt") ctx = context.WithValue(ctx,"jwt",ua) r = r.WithContext(ctx) setupResponse(&w,r) base.ServeHTTP(w,r) })}const host = "localhost" port = 5432 user = "postgres" password = "postgres" dbname = "postgres")func main() psqlInfo := fmt.Sprintf("host=%s port=%d user=%s " "password=%s dbname=%s sslmode=disable", host,port,user,password,dbname) server := &s.Server{psqlInfo} twirpHandler := p.NewFinanceServiceServer(server,nil) wrap := WithUserAgent(twirpHandler) log.Fatalln(http.ListenAndServe(":9707",wrap))}
; i+ W1 {: q+ m, K5 ` 就像我以前在 一样Insomnia 上面说的,它工作得很好,但当我们发出 axiosPOST请求时,在浏览器的控制台上会出现以下内容:
0 S, Q* |$ q+ p: s1 K0 ~1 L已被 CORS 策略阻止:对预检请求的响应未通过访问控制检查:无 HTTP ok 状态。
% f* Y* E: o" Z( d& h, G( o8 P * B9 U" H* G. p1 r5 X
解决方案: 5 w4 S+ u+ R2 ~2 }1 ?( ?
我相信这是最简单的例子:- o0 S+ Q3 q! q y. o
header := w.Header()header.Add("Access-Control-Allow-Origin","*")header.Add("Access-Control-Allow-Methods","DELETE,POST,GET,OPTIONS")header.Add("Access-Control-Allow-Headers","Content-Type,Access-Control-Allow-Headers,Authorization,X-Requested-With")
0 \, l$ o% G2 [% I. I o7 ? 您还可以添加标题Access-Control-Max-Age,当然,你可以允许任何你想要的标题和方法。! R& w' s( W- M8 v4 p& d$ Z7 F
最后,您应响应初始请求:; n5 X Z9 v3 U4 {/ o: u$ l' R7 r4 u+ V
if r.Method == "OPTIONS" w.WriteHeader(http.StatusOK) return}
6 k, P, i5 | ^4 N2 {( R" L 编辑(2019年 6 月):我们现在为此使用gorilla。他们的东西得到了更积极的维护,他们已经这样做了很长时间。把链接留给旧的,以防万一。1 a" i7 G& i: ?: u3 \9 y
以下旧中间件建议: 当然,使用中间件可能更容易。我不认为我用过,但这次似乎强烈推荐。 |
|