Bagaimana untuk Mengendalikan Permintaan HTTP POST untuk JSON-RPC dalam Pelayan Web Go?

DDD
Lepaskan: 2024-11-20 15:49:13
asal
835 orang telah melayarinya

How to Handle HTTP POST Requests for JSON-RPC in a Go Web Server?

Mengakses HTTP JSONRPC daripada Halaman Web

Dalam konteks pengaturcaraan Go, perpustakaan net/rpc dan net/rpc/jsonrpc ialah biasa digunakan untuk komunikasi antara proses. Walau bagaimanapun, menyambung ke pelayan HTTP JSONRPC hanya menggunakan alatan pelayan perpustakaan standard mungkin menimbulkan persoalan.

Pertimbangkan persediaan pelayan asas berikut:

arith := new(server.Arith)

server := rpc.NewServer()
server.Register(arith)

server.HandleHTTP(rpc.DefaultRPCPath, rpc.DefaultDebugPath)

listener, e := net.Listen("tcp", ":4321")
if e != nil {
    log.Fatal("listen error:", e)
}
defer listener.Close()

http.Serve(listener, http.DefaultServeMux)
Salin selepas log masuk

Persediaan ini tidak menyokong permintaan POST secara asli daripada laman web. Kod ini mengharapkan klien HTTP untuk memulakan CONNECT dan menghantar permintaan dan respons JSON RPC secara terus melalui sambungan itu.

Penyelesaian: Mencipta Pengendali HTTP Tersuai

Untuk mendayakan Permintaan POST, pengendali HTTP tersuai boleh dilaksanakan untuk menyesuaikan permintaan/tindak balas HTTP kepada ServerCodec. Berikut ialah contoh:

type HttpConn struct {
    in  io.Reader
    out io.Writer
}

func (c *HttpConn) Read(p []byte) (n int, err error)  { return c.in.Read(p) }
func (c *HttpConn) Write(d []byte) (n int, err error) { return c.out.Write(d) }
func (c *HttpConn) Close() error                      { return nil }

type CakeBaker struct{}

func (cb *CakeBaker) BakeIt(n int, msg *string) error {
    *msg = fmt.Sprintf("your cake has been bacon (%d)", n)
    return nil
}

func TestHTTPServer(t *testing.T) {

    cb := &CakeBaker{}

    server := rpc.NewServer()
    server.Register(cb)

    listener, e := net.Listen("tcp", ":4321")
    if e != nil {
        log.Fatal("listen error:", e)
    }
    defer listener.Close()

    go http.Serve(listener, http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {

        if r.URL.Path == "/bake-me-a-cake" {
            serverCodec := jsonrpc.NewServerCodec(&HttpConn{in: r.Body, out: w})
            w.Header().Set("Content-type", "application/json")
            w.WriteHeader(200)
            err := server.ServeRequest(serverCodec)
            if err != nil {
                log.Printf("Error while serving JSON request: %v", err)
                http.Error(w, "Error while serving JSON request, details have been logged.", 500)
                return
            }
        }

    }))

    resp, err := http.Post("http://localhost:4321/bake-me-a-cake", "application/json", bytes.NewBufferString(
        `{"jsonrpc":"2.0","id":1,"method":"CakeBaker.BakeIt","params":[10]}`,
    ))
    if err != nil {
        panic(err)
    }
    defer resp.Body.Close()
    b, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        panic(err)
    }

    fmt.Printf("returned JSON: %s\n", string(b))

}
Salin selepas log masuk

Pengendali tersuai ini menyesuaikan permintaan/tindak balas HTTP ke dalam format yang sesuai untuk pelayan JSON RPC, membenarkan permintaan POST daripada halaman web atau panggilan CURL baris arahan.

Atas ialah kandungan terperinci Bagaimana untuk Mengendalikan Permintaan HTTP POST untuk JSON-RPC dalam Pelayan Web Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
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