Heim > Backend-Entwicklung > Golang > Wie mache ich JSON-RPC-Anfragen von einer Webseite mit dem net/rpc-Paket von Go?

Wie mache ich JSON-RPC-Anfragen von einer Webseite mit dem net/rpc-Paket von Go?

Patricia Arquette
Freigeben: 2024-11-25 14:46:14
Original
587 Leute haben es durchsucht

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

JSON-RPC-Anfragen von einer Webseite aus erstellen

Die Pakete net/rpc und net/rpc/jsonrpc in Go bieten eine Möglichkeit, zwischen Go-Prozessen mithilfe von JSON zu kommunizieren -RPC. Allerdings wird die Verbindung zu einem JSON-RPC-Server von einer Webseite, die nur die Standardbibliothek verwendet, nicht direkt unterstützt. Während der Server erwartet, dass ein HTTP-Client eine CONNECT-Anfrage ausgibt, verwenden Webbrowser und Befehlszeilentools wie cURL normalerweise POST-Anfragen.

Benutzerdefinierter HTTP-Adapter

Um dies zu beheben, können Sie erstellen ein benutzerdefinierter HTTP-Adapter zur Abwicklung der Konvertierung zwischen HTTP-Anfragen und -Antworten und ein ServerCodec, der vom JSON-RPC-Server verwendet wird.

Code Beispiel

Hier ist ein Beispiel für einen benutzerdefinierten HTTP-Adapter und einen Testdienst:

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))
}
Nach dem Login kopieren

Mithilfe dieses Adapters können Sie einen JSON-RPC-Server erstellen, der POST-Anfragen akzeptiert und diese verarbeitet das Standard-JSON-RPC-Protokoll.

Das obige ist der detaillierte Inhalt vonWie mache ich JSON-RPC-Anfragen von einer Webseite mit dem net/rpc-Paket von Go?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage