«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Как сделать запросы JSON-RPC с веб-страницы с помощью пакета Go net/rpc?

Как сделать запросы JSON-RPC с веб-страницы с помощью пакета Go net/rpc?

Опубликовано 22 ноября 2024 г.
Просматривать:324

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

Выполнение запросов JSON-RPC с веб-страницы

Пакеты net/rpc и net/rpc/jsonrpc в Go предоставляют способ взаимодействия между процессами Go с помощью JSON -РПК. Однако подключение к серверу JSON-RPC с веб-страницы с использованием только стандартной библиотеки напрямую не поддерживается. Хотя сервер ожидает, что HTTP-клиент отправит запрос CONNECT, веб-браузеры и инструменты командной строки, такие как cURL, обычно используют запросы POST.

Пользовательский адаптер HTTP

Чтобы решить эту проблему, вы можете создать специальный адаптер HTTP для обработки преобразования между HTTP-запросами и ответами и ServerCodec, который используется сервером JSON-RPC.

Код Пример

Вот пример пользовательского адаптера 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))
}

Используя этот адаптер, вы можете создать сервер JSON-RPC, который принимает запросы POST и обрабатывает их с использованием стандартного протокола JSON-RPC.

Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3