웹 페이지에서 HTTP JSONRPC 액세스
Go 프로그래밍의 맥락에서 라이브러리 net/rpc 및 net/rpc/jsonrpc는 다음과 같습니다. 일반적으로 프로세스 간 통신에 사용됩니다. 그러나 표준 라이브러리의 서버 도구만 사용하여 HTTP JSONRPC 서버에 연결하면 의문이 생길 수 있습니다.
다음 기본 서버 설정을 고려하세요.
arith := new(server.Arith) server := rpc.NewServer() server.Register(arith) server.HandleHTTP(rpc.DefaultRPCPath, rpc.DefaultDebugPath) listener, e := net.Listen("tcp", ":4321") if e != nil { log.Fatal("listen error:", e) } defer listener.Close() http.Serve(listener, http.DefaultServeMux)
이 설정은 기본적으로 다음의 POST 요청을 지원하지 않습니다. 웹페이지. 코드는 HTTP 클라이언트가 CONNECT를 시작하고 해당 연결을 통해 JSON RPC 요청 및 응답을 직접 전송할 것으로 예상합니다.
해결책: 사용자 정의 HTTP 핸들러 생성
활성화하려면 POST 요청, HTTP 요청/응답을 ServerCodec에 맞게 조정하기 위해 사용자 정의 HTTP 처리기를 구현할 수 있습니다. 예는 다음과 같습니다.
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 } 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) { 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)) }
이 사용자 정의 핸들러는 HTTP 요청/응답을 JSON RPC 서버에 적합한 형식으로 조정하여 웹 페이지 또는 명령줄 CURL 호출에서 POST 요청을 허용합니다.
위 내용은 Go 웹 서버에서 JSON-RPC에 대한 HTTP POST 요청을 처리하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!