Rumah >pembangunan bahagian belakang >Golang >Gerbang CORS grpc GoLang
editor php Strawberry memperkenalkan kepada anda gerbang CORS gRPC GoLang. CORS, singkatan untuk Perkongsian Sumber Silang Asal, ialah mekanisme yang digunakan untuk membuat permintaan merentas domain dalam penyemak imbas. gRPC ialah rangka kerja panggilan prosedur jauh (RPC) sumber terbuka berprestasi tinggi yang boleh digunakan untuk membina sistem teragih. GoLang ialah bahasa pengaturcaraan yang berkuasa dengan kesesuaian dan kesederhanaan yang tinggi. CORS gRPC Gateway GoLang menggabungkan CORS dan gRPC untuk melaksanakan get laluan melalui bahasa Go untuk melaksanakan permintaan merentas domain. Dalam artikel ini, kami akan memperkenalkan secara terperinci prinsip dan penggunaan gerbang CORS gRPC GoLang untuk membantu anda memahami dan menggunakan teknologi ini dengan lebih baik.
Saya mempunyai vue.js 3 bahagian hadapan dan saya memanggil bahagian belakang golang melalui grpc-gateway
. Saya telah melakukan ini untuk seketika, tetapi saya melihat cahaya di hujung terowong.
Saya sedang menghadapi masalah cors. Walau bagaimanapun, saya membaca maklumat yang bercanggah tentang cara menanganinya. Oleh itu, saya ingin menyiarkan sesuatu yang saya harap dapat membantu semua orang.
Berikut ialah kod bagaimana saya memulakan pelayan mux untuk grpc(gerbang)
func runhttpserver(server *http.server, httpendpoint, grpcendpoint, swaggerpath string) (err error) { server.addr = httpendpoint ctx, cancel := context.withcancel(context.background()) defer cancel() // register groc server endpoint mux := runtime.newservemux( runtime.witherrorhandler(func(ctx context.context, mux *runtime.servemux, marshaler runtime.marshaler, w http.responsewriter, r *http.request, err error, ) { s, ok := status.fromerror(err) if ok { if s.code() == codes.unavailable { err = status.error(codes.unavailable, errunavailable) } } runtime.defaulthttperrorhandler(ctx, mux, marshaler, w, r, err) }), ) opts := []grpc.dialoption{ grpc.withtransportcredentials(insecure.newcredentials()), grpc.withchainunaryinterceptor(), } if err = api.registerapiservicehandlerfromendpoint(ctx, mux, grpcendpoint, opts); err != nil { return } swmux := http.newservemux() swmux.handle("/", mux) serveswagger(swmux, swaggerpath) server.handler = swmux return server.listenandserve() }
Di sinilah saya rasa saya patut menambah konfigurasi cors, tetapi saya tidak pasti itu cara saya menyediakannya dalam fail server.go..
var httpserver http.server // run http server with grpc gateway g.go(func() error { fmt.println("starting http sever (port {}) and grpc gateway (port {})", strconv.itoa(cfg.server.httpport), strconv.itoa(cfg.server.grpcport), ) return rest.runhttpserver( &httpserver, ":"+strconv.itoa(cfg.server.httpport), ":"+strconv.itoa(cfg.server.grpcport), "/webapi", ) })
Ralat konsol:
access to xmlhttprequest at 'http://localhost:8080/v1/test' from origin 'http://localhost:9000' has been blocked by cors policy: response to preflight request doesn't pass access control check: no 'access-control-allow-origin'
Saya tidak tahu di mana hendak menambah sesuatu seperti ini
func enablecors(w *http.responsewriter) { (*w).header().set("access-control-allow-origin", "*") }
Saya rasa seperti perlu ada sesuatu yang dibina ke dalam gerbang grpc golang, tetapi saya tidak dapat mencari apa-apa?
Sebarang cadangan amat kami hargai.
-----Kemas kini 1-----
Saya telah mencubanya
func enablecors(h http.handler) http.handler { return http.handlerfunc(func(w http.responsewriter, r *http.request) { w.header().set("access-control-allow-origin", "http://localhost:9000") w.header().set("access-control-allow-methods", "get, put, post, delete, head, options") h.servehttp(w, r) }) }
dan
func enablecors(h http.handler) http.handler { return http.handlerfunc(func(w http.responsewriter, r *http.request) { w.header().set("access-control-allow-origin", "*") w.header().set("access-control-allow-methods", "get, put, post, delete, head, options") h.servehttp(w, r) }) }
dan
func enablecors(h http.handler) http.handler { return http.handlerfunc(func(w http.responsewriter, r *http.request) { w.header().set("access-control-allow-origin", "http://localhost") w.header().set("access-control-allow-methods", "get, put, post, delete, head, options") h.servehttp(w, r) }) }
Digabungkan
func serveSwagger(mux *http.ServeMux, swaggerPath string) { fileServer := http.FileServer(http.Dir(swaggerPath)) prefix := "/swagger-ui" mux.Handle(prefix, http.StripPrefix(prefix, fileServer)) }
Masih mengalami masalah yang sama.. Sangat mengecewakan
Berdasarkan ralat terbaru yang anda berikan dalam komen:
Akses kepada xmlhttprequest di 'localhost:8080/v1/test' dari asal 'localhost:9000' telah disekat oleh dasar cors: Respons kepada permintaan preflight gagal semakan kawalan akses: ia tidak mempunyai status normal http.
Pelayar anda sedang menghantar permintaan preflight (kaedah options
http) untuk menentukan sama ada permintaan silang asal yang diperlukan boleh dibuat.
Pelayan bertindak balas dengan respons bukan 2xx.
Saya mengesyaki ini adalah kerana fungsi enablecors
anda menyebarkan permintaan kepada pengendali grpc-gateway, yang tidak berpuas hati dengan kaedah enablecors
函数正在将请求传播到 grpc-gateway 处理程序,该处理程序对 options
http dan mengembalikan status ralat, mungkin:
< http/1.1 501 not implemented < content-type: application/json < vary: origin < date: fri, 25 nov 2022 11:17:52 gmt < content-length: 55 < {"code":12,"message":"method not allowed","details":[]}
Jadi untuk mengelakkan ini, anda ingin tidak menyebarkan permintaan itu lebih lanjut apabila membuat permintaan pra-penerbangan, seperti
func enablecors(h http.handler) http.handler { return http.handlerfunc(func(w http.responsewriter, r *http.request) { w.header().set("access-control-allow-origin", "http://localhost:9000") w.header().set("access-control-allow-methods", "get, put, post, delete, head, options") if r.method == http.methodoptions { w.writeheader(http.statusnocontent) return } h.servehttp(w, r) }) }
Tetapi , perkara di atas mungkin masih bukan pelaksanaan pengendalian cors yang munasabah. Anda harus menggunakan pakej sedia ada untuk ini, seperti github.com/rs/cors, yang akan mengendalikan perkara ini dengan cara yang wajar dan mengendalikan sebarang kemungkinan perangkap dll.
Jadi import dan lakukan perkara berikut: github.com/rs/cors
server.Handler = cors.AllowAll().Handler(swMux)sepatutnya membuat anda mula membiarkan segala-galanya berlalu. Pustaka ini akan membolehkan anda menyesuaikan asal-usul tertentu, kaedah http, dsb. mengikut keperluan anda.
Atas ialah kandungan terperinci Gerbang CORS grpc GoLang. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!