Gerbang CORS grpc GoLang

WBOY
Lepaskan: 2024-02-12 12:54:09
ke hadapan
1061 orang telah melayarinya

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.

Kandungan soalan

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()

}
Salin selepas log masuk

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",
    )
})
Salin selepas log masuk

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'
Salin selepas log masuk

Saya tidak tahu di mana hendak menambah sesuatu seperti ini

func enablecors(w *http.responsewriter) {
    (*w).header().set("access-control-allow-origin", "*")
}
Salin selepas log masuk

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)
    })
}
Salin selepas log masuk

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)
    })
}
Salin selepas log masuk

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)
    })
}
Salin selepas log masuk

Digabungkan

func serveSwagger(mux *http.ServeMux, swaggerPath string) {
    fileServer := http.FileServer(http.Dir(swaggerPath))
    prefix := "/swagger-ui"
    mux.Handle(prefix, http.StripPrefix(prefix, fileServer))
}
Salin selepas log masuk

Masih mengalami masalah yang sama.. Sangat mengecewakan

Penyelesaian

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":[]}
Salin selepas log masuk

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)
    })
}
Salin selepas log masuk

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)
Salin selepas log masuk
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!

Label berkaitan:
sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!