標準ライブラリを使用した HTTP サーバーへの JSON RPC アクセス
JSON RPC は、データ形式として JSON を使用する RPC プロトコルです。これにより、クライアントは POST リクエストを使用して HTTP 経由でサーバーと通信できるようになります。 Go の標準ライブラリは、RPC サーバーを実装するためのパッケージを提供しますが、現在、JSON RPC を直接サポートしていません。
問題:
提供されたサーバー設定では、標準ライブラリの net/rpc パッケージ。クライアントが CONNECT 接続を確立し、ストリーム経由で JSON RPC リクエストを送信することを期待します。これは、Web に接続するアプリケーションにとって一般的または互換性のあるアプローチではありません。
解決策:
この問題の解決策は、HTTP に適応するカスタム HTTP ハンドラーを作成することです。 ServerCodec へのリクエスト/レスポンス。これにより、サーバーは POST リクエストを介して JSON RPC リクエストを処理できるようになります:
import ( "bytes" "io" "net/http" "net/rpc" "net/rpc/jsonrpc" ) 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 } http.HandleFunc("/rpc", func(w http.ResponseWriter, r *http.Request) { serverCodec := jsonrpc.NewServerCodec(&HttpConn{in: r.Body, out: w}) w.Header().Set("Content-type", "application/json") w.WriteHeader(200) server.ServeRequest(serverCodec) })
実装:
サンプル コード スニペットでは、CakeBaker サービスがサーバーに登録されています。 。 HTTP ハンドラーが HTTP サーバーに追加され、サーバーはポート 4321 で待機します。クライアントは、JSON RPC リクエスト ペイロードを使用して POST リクエストを「http://localhost:4321/rpc」に送信できるようになります。サーバーはリクエストを解析し、対応するメソッドを実行し、結果をレスポンスで返します。
以上が標準ライブラリで JSON-RPC を使用して Go HTTP サーバーにアクセスするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。