Rumah >pembangunan bahagian belakang >Golang >Bagaimana untuk Membuat Permintaan JSON-RPC daripada Halaman Web Menggunakan Pakej net/rpc Go?

Bagaimana untuk Membuat Permintaan JSON-RPC daripada Halaman Web Menggunakan Pakej net/rpc Go?

Patricia Arquette
Patricia Arquetteasal
2024-11-25 14:46:14637semak imbas

How to Make JSON-RPC Requests from a Web Page Using Go's net/rpc Package?

Membuat Permintaan JSON-RPC daripada Halaman Web

Pakej net/rpc dan net/rpc/jsonrpc dalam Go menyediakan cara untuk berkomunikasi antara proses Go menggunakan JSON -RPC. Walau bagaimanapun, penyambungan ke pelayan JSON-RPC dari halaman web hanya menggunakan perpustakaan standard tidak disokong secara langsung. Walaupun pelayan menjangkakan klien HTTP mengeluarkan permintaan CONNECT, penyemak imbas web dan alatan baris perintah seperti cURL biasanya menggunakan permintaan POST.

Penyesuai HTTP Tersuai

Untuk menangani perkara ini, anda boleh membuat penyesuai HTTP tersuai untuk mengendalikan penukaran antara permintaan dan respons HTTP dan ServerCodec, yang digunakan oleh JSON-RPC pelayan.

Contoh Kod

Berikut ialah contoh penyesuai HTTP tersuai dan perkhidmatan ujian:

import (
    "bytes"
    "fmt"
    "io"
    "io/ioutil"
    "log"
    "net"
    "net/http"
    "net/rpc"
    "net/rpc/jsonrpc"
    "testing"
)

// adapt HTTP connection to ReadWriteCloser
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 }

// our service
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) {

    fmt.Printf("TestHTTPServer\n")

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

Dengan menggunakan penyesuai ini, anda boleh mencipta JSON-RPC pelayan yang menerima permintaan POST dan memprosesnya menggunakan protokol JSON-RPC standard.

Atas ialah kandungan terperinci Bagaimana untuk Membuat Permintaan JSON-RPC daripada Halaman Web Menggunakan Pakej net/rpc Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
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