我正在使用网络库,我想进行RPC调用:
Client.Call("action", []string{"arg1", "arg2"}, &response)
但是在JSON中,我看到了:
{"method":"action","params":[["arg1","arg2"]],"id":0}
请注意,参数用双方括号括起来。
就我而言,我需要将params列为简单列表:
{"method":"action","params":["arg1","arg2"],"id":0}
任何想法如何做到这一点?
答案 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
通过自定义编解码器创建客户端: