ホームページ  >  記事  >  バックエンド開発  >  標準ライブラリで JSON-RPC を使用して Go HTTP サーバーにアクセスするにはどうすればよいですか?

標準ライブラリで JSON-RPC を使用して Go HTTP サーバーにアクセスするにはどうすればよいですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-11-21 08:47:10609ブラウズ

How Can I Access a Go HTTP Server Using JSON-RPC with the Standard Library?

標準ライブラリを使用した 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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。