JSON RPC Client Go 是一个用于在 Go 语言中实现 JSON-RPC 客户端的库。

huangapple go评论73阅读模式
英文:

JSON RPC Client Go

问题

我有一个通过JSON-RPC提供响应的Python服务器。这是服务器返回的示例响应。

'{"jsonrpc": "2.0", "result": "Peer 1: local 10.10.0.2  remote 10.10.0.1  state CONNECT\nPeer 2: local 10.10.0.18  remote 10.10.0.17  state ESTABLISHED\nPeer 3: local 10.10.0.10  remote 10.10.0.9  state ESTABLISHED", "id": "839732f9-cf36-46ff-8b9b-6120250d9ce5"}'

这是我需要发送到服务器的请求:

'{"method":"echo","jsonrpc":"2.0","params":["test_params"],"id":"839732f9-cf36-46ff-8b9b-6120250d9ce5"}'

这是我的Go语言客户端:

package main

import (
    "fmt"
    "log"
    "net"
    "net/rpc/jsonrpc"
)
type Args struct {
    jsonrpc, id string
}

func main() {
    conn, err := net.Dial("tcp", "11.21.22.221:8080")
    if err != nil {
        panic(err)
    }
    defer conn.Close()

    args := Args{"2.0", "d87198f0-af92-49f8-9a7d-ab8bed5c4d17"}
    var reply string

    c := jsonrpc.NewClient(conn)

    err = c.Call("echo", args, &reply)
    if err != nil {
        log.Fatal("error:", err)
    }
    fmt.Printf("Response: %d", reply)
}

但是,当我运行这个客户端时,它没有发送任何参数。相反,它发送了空参数,像这样:

'{"method":"echo","params":[{}],"id":0}\n

有人可以帮助我告诉我犯了什么错误吗?我是Go语言的新手。

谢谢。

英文:

I have a python server serving response through JSON-RPC. Here is a sample response from the server.

'{"jsonrpc": "2.0", "result": "Peer 1: local 10.10.0.2  remote 10.10.0.1  state CONNECT\\nPeer 2: local 10.10.0.18  remote 10.10.0.17  state ESTABLISHED\\nPeer 3: local 10.10.0.10  remote 10.10.0.9  state ESTABLISHED", "id": "839732f9-cf36-46ff-8b9b-6120250d9ce5"}'

Here is the request I need to send to the server:

'{"method":"echo","jsonrpc":"2.0","params":["test_params"],"id":"839732f9-cf36-46ff-8b9b-6120250d9ce5"}'

Here is my client with go language:

package main

import (
    "fmt"
    "log"
    "net"
    "net/rpc/jsonrpc"
)
type Args struct {
    jsonrpc, id string
}

func main() {
    conn, err := net.Dial("tcp", "11.21.22.221:8080")
    if err != nil {
        panic(err)
    }
    defer conn.Close()

    args := Args{"2.0", "d87198f0-af92-49f8-9a7d-ab8bed5c4d17"}
    var reply string

    c := jsonrpc.NewClient(conn)

    err = c.Call("echo", args, &reply)
    if err != nil {
        log.Fatal("error:", err)
    }
    fmt.Printf("Response: %d", reply)
}

But, when I run this client, it is not sending anything in the params. Instead it is sending empty params like this:

'{"method":"echo","params":[{}],"id":0}\n

Can somebody help me telling what mistake I am making? I am a newbie to go language.

Thanks.

答案1

得分: 1

我认为你所做的事情在使用go提供的客户端时是不可能的,因为私有的clientRequest结构目前被定义为:

type clientRequest struct {
    Method string         `json:"method"`
    Params [1]interface{} `json:"params"`
    Id     uint64         `json:"id"`
}

你传递给Call作为args的内容被放入Params中,注意这个结构中没有"Version":"jsonrpc"的字段。

根据我所了解(可能有误,这是我第一次阅读这段代码),你需要实现自己的ClientCodec。你可以复制大部分(或全部)标准库中的部分代码,并将该字段添加到上述的clientRequest中。;-)

英文:

I don't think what you are doing is possible using the client as provided by go because the private clientRequest struct is currently defined as:

	type clientRequest struct {
		Method string         `json:"method"`
		Params [1]interface{} `json:"params"`
		Id     uint64         `json:"id"`
	}

What you pass into Call as args is stuck into Params and note how there is no "Version `json:"jsonrpc"`" inside of that struct.

AFAICT (which may be wrong, this is my first time reading through this code) you would need to implement your own ClientCodec. You could probably get away with copying most (all) of the parts out of the stdlib and add the field to the clientRequest above. JSON RPC Client Go 是一个用于在 Go 语言中实现 JSON-RPC 客户端的库。

huangapple
  • 本文由 发表于 2015年4月7日 04:44:41
  • 转载请务必保留本文链接:https://go.coder-hub.com/29479360.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定