Rumah >pembangunan bahagian belakang >Golang >Gerbang CORS grpc GoLang

Gerbang CORS grpc GoLang

WBOY
WBOYke hadapan
2024-02-12 12:54:091113semak imbas

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

}

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

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":[]}

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!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam