2017-12-24 17 views
2

Goでのthis specificationに基づくHTTP経由のJSON-RPCの使用方法を教えてください。GoでのHTTP経由のJSONRPC

Goはnet/rpc/jsonrpcでJSON-RPCコーデックを提供しますが、このコーデックは入力としてネットワーク接続を使用するため、RPC HTTPハンドラと一緒に使用することはできません。

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の組み込みライブラリに基づいて最高のソリューションだと思う。 –

関連する問題