2017-12-24 28 views
2

go에서 this specification을 기반으로 한 HTTP를 통한 JSON-RPC를 어떻게 사용할 수 있습니까?Go에서 HTTP를 통한 JSONRPC

Go는 net/rpc/jsonrpc에 JSON-RPC 코덱을 제공하지만이 코덱은 네트워크 연결을 입력으로 사용하므로 RPC HTTP 처리기와 함께 사용할 수 없습니다. JSON-RPC 용 TCP를 사용하는 샘플 코드를 첨부합니다.

func main() { 
    cal := new(Calculator) 
    server := rpc.NewServer() 
    server.Register(cal) 
    listener, e := net.Listen("tcp", ":1234") 
    if e != nil { 
     log.Fatal("listen error:", e) 
    } 
    for { 
     if conn, err := listener.Accept(); err != nil { 
      log.Fatal("accept error: " + err.Error()) 
     } else { 
      log.Printf("new connection established\n") 
      go server.ServeCodec(jsonrpc.NewServerCodec(conn)) 
     } 
    } 
} 
+0

"rpc http handler"란 무엇입니까? –

+0

@CeriseLimon [this] (https://golang.org/pkg/net/rpc/#Server.HandleHTTP) 함수는 기본 http 서버에 http 핸들러를 등록합니다. –

답변

2

내장 RPC HTTP 처리기는 하이재킹 된 HTTP 연결에서 gob 코덱을 사용합니다. JSONRPC를 사용하여 동일한 작업을 수행하는 방법은 다음과 같습니다.

하이재킹 된 연결로 JSONRPC 서버를 실행하는 HTTP 처리기를 작성하십시오.

func serveJSONRPC(w http.ResponseWriter, req *http.Request) { 
    if req.Method != "CONNECT" { 
     http.Error(w, "method must be connect", 405) 
     return 
    } 
    conn, _, err := w.(http.Hijacker).Hijack() 
    if err != nil { 
     http.Error(w, "internal server error", 500) 
     return 
    } 
    defer conn.Close() 
    io.WriteString(conn, "HTTP/1.0 Connected\r\n\r\n") 
    jsonrpc.ServeConn(conn) 
} 

이 핸들러를 HTTP 서버에 등록하십시오. 예 :

http.HandleFunc("/rpcendpoint", serveJSONRPC) 

EDIT : OP가 이후로 연결 대신 GET/POST를 원하는지 확인하기 위해 업데이트 된 질문이 있습니다.

+0

[JSON-RPC 스펙] (http://www.jsonrpc.org/historical/json-rpc-over-http.html)에서 HTTP 메소드로 GET 또는 POST를 사용해야한다고 언급했지만, 방법. –

+0

@ParhamAlvani 질문에 대한 귀하의 질문과 의견은이 솔루션을 가리 킵니다. 질문을 업데이트하여 원하는 것을 말하십시오. –

+0

감사합니다. 질문을 업데이트했습니다. 하지만이 솔루션은 Go 내장 라이브러리를 기반으로하는 최상의 솔루션이라고 생각합니다. –