go - 如何将多个参数传递给 golang net rpc 调用

标签 go rpc

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

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

但在 JSON 中我看到:

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

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

在我的例子中,我需要的参数是一个简单的列表:

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

有什么想法可以实现吗?

最佳答案

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

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

在此处查看WriteRequest 函数:

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

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

接口(interface)记录在这里:

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

关于go - 如何将多个参数传递给 golang net rpc 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51180914/

相关文章:

for-loop - 更新 map 中的键,同时遍历该 map

go - 限制运行的例程数量

go - 在运行时使用反射创建 slice 实例

使用 JSON-RPC 编码数据时出错 - 我是不是很笨?

go - 基于接口(interface)抽象实现一个 'Stringer'

c - 从多线程 RPC 服务器返回带有字符串的结构

dataframe - Pyspark:序列化任务超过允许的最大值。考虑增加 spark.rpc.message.maxSize 或对大值使用广播变量

java - Java 和 C 之间的远程过程调用

c++ - Windows 服务通信选项

go - gobot 中转换的参数太多