Go의 net/rpc 및 net/rpc/jsonrpc 패키지는 JSON을 사용하여 Go 프로세스 간에 통신하는 방법을 제공합니다. -RPC. 그러나 표준 라이브러리만을 사용하여 웹 페이지에서 JSON-RPC 서버에 연결하는 것은 직접 지원되지 않습니다. 서버는 HTTP 클라이언트가 CONNECT 요청을 발행할 것으로 예상하지만 웹 브라우저와 cURL과 같은 명령줄 도구는 일반적으로 POST 요청을 사용합니다.
이 문제를 해결하려면 다음을 만들 수 있습니다. HTTP 요청과 응답 간의 변환을 처리하는 사용자 정의 HTTP 어댑터와 JSON-RPC 서버에서 사용되는 ServerCodec.
다음은 사용자 정의 HTTP 어댑터 및 테스트 서비스의 예입니다.
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)) }
이 어댑터를 사용하면 POST 요청을 수락하고 표준 JSON-RPC 프로토콜을 사용하여 처리하는 JSON-RPC 서버를 생성할 수 있습니다.
부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.
Copyright© 2022 湘ICP备2022001581号-3