JSON RPC 客户端 Go

标签 json go client rpc

我有一个 python 服务器通过 JSON-RPC 服务响应。这是来自服务器的示例响应。

'{"jsonrpc": "2.0", "result": "Peer 1: local 10.10.0.2  remote 10.10.0.1  state CONNECT\\nPeer 2: local 10.10.0.18  remote 10.10.0.17  state ESTABLISHED\\nPeer 3: local 10.10.0.10  remote 10.10.0.9  state ESTABLISHED", "id": "839732f9-cf36-46ff-8b9b-6120250d9ce5"}'

这是我需要发送到服务器的请求:

'{"method":"echo","jsonrpc":"2.0","params":["test_params"],"id":"839732f9-cf36-46ff-8b9b-6120250d9ce5"}'

这是我用go语言的客户端:

package main

import (
    "fmt"
    "log"
    "net"
    "net/rpc/jsonrpc"
)
type Args struct {
    jsonrpc, id string
}

func main() {
    conn, err := net.Dial("tcp", "11.21.22.221:8080")
    if err != nil {
        panic(err)
    }
    defer conn.Close()

    args := Args{"2.0", "d87198f0-af92-49f8-9a7d-ab8bed5c4d17"}
    var reply string

    c := jsonrpc.NewClient(conn)

    err = c.Call("echo", args, &reply)
    if err != nil {
        log.Fatal("error:", err)
    }
    fmt.Printf("Response: %d", reply)
}

但是,当我运行这个客户端时,它没有在参数中发送任何内容。相反,它会像这样发送空参数:

'{"method":"echo","params":[{}],"id":0}\n

有人可以帮我说说我犯了什么错误吗?我是 Go 语言的新手。

谢谢。

最佳答案

我认为使用 go 提供的客户端无法实现您正在做的事情,因为私有(private) clientRequest 结构当前定义为:

    type clientRequest struct {
        Method string         `json:"method"`
        Params [1]interface{} `json:"params"`
        Id     uint64         `json:"id"`
    }

您作为 args 传递给 Call 的内容被卡在 Params 中,请注意没有“Version `json:”jsonrpc”` "在该结构内部。

AFAICT(这可能是错误的,这是我第一次阅读这段代码)你需要实现自己的 ClientCodec .您可能会从 stdlib 中复制大部分(所有)部分并将该字段添加到上面的 clientRequest 中。 ;-)

关于JSON RPC 客户端 Go,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29479360/

相关文章:

json - 将[][]接口(interface)转换为[][]字符串

php - 客户端上的套接字连接不起作用

python - 如何在 Linux Azure Web 应用程序上安装和配置 Oracle Instant Client

dictionary - 戈朗 : Using a defined interface in a Map Value

authentication - Jersey 客户端 API - 身份验证

javascript - 如何摆脱 Python json.dumps 中的 'quot'

javascript - 有人能告诉我为什么 json2.js 不能解析这个字符串吗?

c# - Json 从 JSON 对象 C# 中获取数组对象

php - 使用 PHP 从 mysql 获取数据到 JSON 可以在本地工作,但不能在服务器上工作

email - 如何通过 Gmail API 发送电子邮件?走