Maison > développement back-end > Golang > 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 ?

Patricia Arquette
Libérer: 2024-11-25 14:46:14
original
626 Les gens l'ont consulté

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))
}
Copier après la connexion

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

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal