【问题标题】:How to pass multiple arguments to golang net rpc call如何将多个参数传递给 golang net rpc 调用
【发布时间】:2018-12-13 07:44:29
【问题描述】:

我在 go 中使用 net 库,我想进行 RPC 调用:

Client.Call("action", []string{"arg1", "arg2"}, &response)

但在 JSON 中我看到了:

{"method":"action","params":[["arg1","arg2"]],"id":0}

注意参数用双方括号括起来。

在我的情况下,我需要 params 是一个简单的列表:

{"method":"action","params":["arg1","arg2"],"id":0}

任何想法如何做到这一点?

【问题讨论】:

    标签: go rpc


    【解决方案1】:

    Go 的 JSON RPC 在 rpc.Client 之上使用的编解码器将采用您发送的任何参数并将其编码为它用于参数的数组的第一个元素。

    因此,编码的请求将始终具有一个只有一个元素的顶级数组,其中将包含您发送的参数,正如您已经指出的那样。

    在此处查看WriteRequest 函数:

    https://golang.org/src/net/rpc/jsonrpc/client.go#L57

    要实现你想要的,你可以实现一个自定义的rpc.ClientCodec

    接口记录在这里:

    https://golang.org/pkg/net/rpc/#ClientCodec

    您可以在此处借用默认 JSON 编解码器的几乎所有实现:

    https://golang.org/src/net/rpc/jsonrpc/client.go

    并修改请求的params属性为:

    Params interface{} `json:"params"`
    

    然后在基于标准编写WriteRequest 时,您只需将参数分配给请求参数即可:

    c.req.Params[0] = param
    

    然后您可以使用rpc.NewClientWithCodec 使用您的自定义编解码器创建客户端:

    https://golang.org/pkg/net/rpc/#NewClientWithCodec

    【讨论】:

    • 谢谢。我挖到了我看到 c.req.Params[0] = param 行的地方,发现它已经有 8 年历史了。
    猜你喜欢
    • 2017-12-19
    • 2010-12-27
    • 1970-01-01
    • 2020-11-07
    • 1970-01-01
    • 2018-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多