"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > كيفية تقديم طلبات JSON-RPC من صفحة ويب باستخدام حزمة net/rpc الخاصة بـ Go؟

كيفية تقديم طلبات JSON-RPC من صفحة ويب باستخدام حزمة net/rpc الخاصة بـ Go؟

تم النشر بتاريخ 2024-11-22
تصفح:866

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 -RPC. ومع ذلك، فإن الاتصال بخادم 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