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

时间:2018-07-04 21:25:26

标签: go rpc

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

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

但是在JSON中,我看到了:

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

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

就我而言,我需要将params列为简单列表:

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

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

1 个答案:

答案 0 :(得分:2)

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