"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > Comment effectuer des requêtes JSON-RPC à partir d'une page Web à l'aide du package net/rpc de Go ?

Comment effectuer des requêtes JSON-RPC à partir d'une page Web à l'aide du package net/rpc de Go ?

Publié le 2024-11-22
Parcourir:238

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

Faire des requêtes JSON-RPC à partir d'une page Web

Les packages net/rpc et net/rpc/jsonrpc dans Go fournissent un moyen de communiquer entre les processus Go à l'aide de JSON -RPC. Cependant, la connexion à un serveur JSON-RPC depuis une page Web en utilisant uniquement la bibliothèque standard n'est pas directement prise en charge. Alors que le serveur s'attend à ce qu'un client HTTP émette une requête CONNECT, les navigateurs Web et les outils de ligne de commande comme cURL utilisent généralement des requêtes POST.

Adaptateur HTTP personnalisé

Pour résoudre ce problème, vous pouvez créer un adaptateur HTTP personnalisé pour gérer la conversion entre les requêtes et réponses HTTP et un ServerCodec, qui est utilisé par le serveur JSON-RPC.

Code Exemple

Voici un exemple d'adaptateur HTTP personnalisé et de service de test :

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

En utilisant cet adaptateur, vous pouvez créer un serveur JSON-RPC qui accepte les requêtes POST et les traite à l'aide du protocole JSON-RPC standard.

Dernier tutoriel Plus>

Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.

Copyright© 2022 湘ICP备2022001581号-3