【问题标题】:How to properly call JSON-RPC in Go?如何在 Go 中正确调用 JSON-RPC?
【发布时间】:2012-02-13 15:55:28
【问题描述】:

我一直在尝试各种配置以便在 Go 中调用 a simple JSON-RPC server for Bitcoin,但没有成功。

在 Python 中,整个代码如下所示:

from jsonrpc import ServiceProxy
access = ServiceProxy("http://user:pass@127.0.0.1:8332")
print access.getinfo()

但是在 Go 中,我似乎遇到了像 "too many colons in address" 这样的错误,或者“没有这样的主机”。我已经尝试使用 rpc 和 rpc/jsonrpc 包,使用方法 Dial 和 DialHTTP,使用各种网络参数,但仍然无法到达任何地方。

那么,如何在 Go 中正确调用 JSON-RPC 服务器?

【问题讨论】:

  • 这不是您问题的解决方案吗? stackoverflow.com/questions/8854682/go-json-rpc-too-many-colons
  • 不,这仅解决了我认为的部分问题,我仍然会收到“没有这样的主机”和其他错误,具体取决于我尝试了许多不同配置中的哪一个。这就是为什么我会欣赏一些工作代码,因为检查选项,例如是否将“http://”放在地址中,使用哪个网络,是否使用 rpc 或 jsonrpc,是否调用 Dial 或 DialHTTP 会产生太多尝试调整所有选项。

标签: json request go rpc json-rpc


【解决方案1】:

jsonrpc 包目前不支持基于 HTTP 的 json-rpc。所以,你不能使用它,抱歉。

但是jsonrpc specification 非常简单,编写自己的jsonrpchttp(哦,我希望你知道一个更好的名字)包可能很容易。

我能够使用以下(可怕的)代码成功调用“getinfo”:

package main

import (
    "encoding/json"
    "io/ioutil"
    "log"
    "net/http"
    "strings"
)

func main() {
    data, err := json.Marshal(map[string]interface{}{
        "method": "getinfo",
        "id":     1,
        "params": []interface{}{},
    })
    if err != nil {
        log.Fatalf("Marshal: %v", err)
    }
    resp, err := http.Post("http://bob:secret@127.0.0.1:8332",
        "application/json", strings.NewReader(string(data)))
    if err != nil {
        log.Fatalf("Post: %v", err)
    }
    defer resp.Body.Close()
    body, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        log.Fatalf("ReadAll: %v", err)
    }
    result := make(map[string]interface{})
    err = json.Unmarshal(body, &result)
    if err != nil {
        log.Fatalf("Unmarshal: %v", err)
    }
    log.Println(result)
}

也许您可以通过实现rpc.ClientCodec 接口来稍微清理一下(参见jsonrpc/client.go 的示例)。然后你可以利用 Go 的 rpc 包。

【讨论】:

  • 嗯,你似乎有一些旧的导入发生了一些变化——“encoding/json”到“json”,“net/http”到“http”。除此之外,非常感谢!至于编写我自己的库,好吧,我想这样做,但我认为我不明白 jsonrpc 包中应该去哪里。可能应该开始一些回购,因为我可以看到有几个人有同样的问题。
  • 我目前正在使用最新的提示。当 Go 1 发布时,这些导入将很快改变。顺便说一句,我还在 Go 问题跟踪器上提交了一个错误报告,但优先级已更改为“稍后”,因此目前单独的包可能是个好主意。
  • 用服务器实现更新了代码。虽然对 rpc 编解码器不太了解,所以我的实现基于 http 包(注册要为特定方法调用的函数,然后执行它们)。
猜你喜欢
  • 1970-01-01
  • 2022-08-16
  • 2014-09-24
  • 2013-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-11
  • 2017-07-02
相关资源
最近更新 更多