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.
Um dieses Problem 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.
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)) }
Mit diesem Adapter können Sie einen JSON-RPC-Server erstellen, der POST-Anfragen akzeptiert und diese mithilfe des Standard-JSON-RPC-Protokolls verarbeitet.
Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.
Copyright© 2022 湘ICP备2022001581号-3