從網頁存取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 處理程序以使 HTTP 請求/回應適應 ServerCodec。以下是一個範例:
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 Web 伺服器中處理 JSON-RPC 的 HTTP POST 請求?的詳細內容。更多資訊請關注PHP中文網其他相關文章!