JSON RPC 客户端

Posted

技术标签:

【中文标题】JSON RPC 客户端【英文标题】:JSON RPC Client Go 【发布时间】:2015-04-06 20:44:41 【问题描述】:

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

'"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 语言的新手。

谢谢。

【问题讨论】:

我怀疑这与 jsonrpc 和 id 是小写的有关,因此是 Args 结构的私有。如果您调用的 API 需要小写 args,您可以使用 struct 标签来解决这个问题 非常感谢。该标记在一定程度上有助于添加参数,但是,我需要像这样将标签添加到实际的 JSON 本身 - 如何添加 jsonrpc 并编辑 id 值`'"method":"echo"," jsonrpc":"2.0","params":["test_params"],"id":"839732f9-cf36-46ff-8b9b-6120250d9ce5"' ` @rob74 或有人请告诉我如何编辑 JSON RPC 请求中传递的 id 值,甚至添加 jsonrpc 版本以及 JSON(2.0 需要 jsonrpc)? 【参考方案1】:

我认为使用 go 提供的客户端是不可能的,因为私有 clientRequest 结构当前定义为:

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

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

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

【讨论】:

以上是关于JSON RPC 客户端的主要内容,如果未能解决你的问题,请参考以下文章

C# 中 JSON-RPC 客户端的示例代码

用于 PHP 的 JSON-RPC 2 客户端能够调用嵌套类中的方法

java - 从客户端执行 json 远程过程调用(RPC)

服务模块drupal的json rpc客户端

使用 node-json-rpc 库中的客户端时使用正确的 SSL 协议

如何使用 android-json-rpc 进行 Android(客户端)/Java(服务器)设置?