>  기사  >  백엔드 개발  >  Go의 net/rpc 패키지를 사용하여 웹 페이지에서 JSON-RPC 요청을 만드는 방법은 무엇입니까?

Go의 net/rpc 패키지를 사용하여 웹 페이지에서 JSON-RPC 요청을 만드는 방법은 무엇입니까?

Patricia Arquette
Patricia Arquette원래의
2024-11-25 14:46:14562검색

How to Make JSON-RPC Requests from a Web Page Using Go's net/rpc Package?

웹 페이지에서 JSON-RPC 요청하기

Go의 net/rpc 및 net/rpc/jsonrpc 패키지는 JSON을 사용하여 Go 프로세스 간에 통신하는 방법을 제공합니다. -RPC. 그러나 표준 라이브러리만을 사용하여 웹 페이지에서 JSON-RPC 서버에 연결하는 것은 직접 지원되지 않습니다. 서버는 HTTP 클라이언트가 CONNECT 요청을 발행할 것으로 예상하지만 웹 브라우저와 cURL과 같은 명령줄 도구는 일반적으로 POST 요청을 사용합니다.

사용자 정의 HTTP 어댑터

이 문제를 해결하려면 다음을 생성할 수 있습니다. HTTP 요청과 응답 간의 변환을 처리하기 위한 사용자 정의 HTTP 어댑터와 JSON-RPC 서버에서 사용되는 ServerCodec.

코드 예

다음은 사용자 정의 HTTP 어댑터 및 테스트 서비스의 예입니다.

import (
    "bytes"
    "fmt"
    "io"
    "io/ioutil"
    "log"
    "net"
    "net/http"
    "net/rpc"
    "net/rpc/jsonrpc"
    "testing"
)

// adapt HTTP connection to ReadWriteCloser
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 }

// our service
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) {

    fmt.Printf("TestHTTPServer\n")

    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))
}

이 어댑터를 사용하면 POST 요청을 수락하고 이를 처리하는 JSON-RPC 서버를 생성할 수 있습니다. 표준 JSON-RPC 프로토콜입니다.

위 내용은 Go의 net/rpc 패키지를 사용하여 웹 페이지에서 JSON-RPC 요청을 만드는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.