Accès JSON RPC au serveur HTTP à l'aide de la bibliothèque standard
JSON RPC est un protocole RPC qui utilise JSON comme format de données. Il permet aux clients de communiquer avec les serveurs via HTTP à l'aide de requêtes POST. La bibliothèque standard de Go fournit des packages pour l'implémentation de serveurs RPC, mais il n'existe actuellement aucune prise en charge directe pour JSON RPC.
Problème :
La configuration du serveur fournie utilise la norme Le package net/rpc de la bibliothèque, qui attend des clients qu'ils établissent une connexion CONNECT et envoient des requêtes JSON RPC via le flux. Il ne s'agit pas d'une approche courante ou compatible pour les applications Web.
Solution :
La solution à ce problème consiste à créer un gestionnaire HTTP personnalisé qui adapte le protocole HTTP demande/réponse à un ServerCodec. Cela permet au serveur de gérer les requêtes JSON RPC sur les requêtes POST :
import ( "bytes" "io" "net/http" "net/rpc" "net/rpc/jsonrpc" ) 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 } http.HandleFunc("/rpc", func(w http.ResponseWriter, r *http.Request) { serverCodec := jsonrpc.NewServerCodec(&HttpConn{in: r.Body, out: w}) w.Header().Set("Content-type", "application/json") w.WriteHeader(200) server.ServeRequest(serverCodec) })
Implémentation :
Dans l'exemple d'extrait de code, un service CakeBaker est enregistré auprès du serveur . Le gestionnaire HTTP est ajouté au serveur HTTP et le serveur écoute sur le port 4321. Un client peut désormais envoyer une requête POST à « http://localhost:4321/rpc » avec une charge utile de requête JSON RPC. Le serveur analysera la requête, exécutera la méthode correspondante et renverra le résultat dans la réponse.
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!