Как передать множественные аргументы в golang net rpc call - PullRequest
0 голосов
/ 05 июля 2018

Я использую библиотеку net в go и хочу сделать вызов 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 голосов
/ 05 июля 2018

Кодек, который JSON RPC Go использует поверх 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

...