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.
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.
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 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!