如何在Go中正确调用JSON-RPC?
我一直在尝试各种配置以调用Go,但没有成功 在Python中,整个代码如下所示:如何在Go中正确调用JSON-RPC?,json,request,go,rpc,json-rpc,Json,Request,Go,Rpc,Json Rpc,我一直在尝试各种配置以调用Go,但没有成功 在Python中,整个代码如下所示: from jsonrpc import ServiceProxy access = ServiceProxy("http://user:pass@127.0.0.1:8332") print access.getinfo() 但在围棋中,我似乎遇到了错误,比如“没有这样的主人”。我尝试过使用rpc和rpc/jsonrpc两个包,使用方法Dial和DialHTTP,使用各种网络参数,但仍然一无所获 那么,如何在Go
from jsonrpc import ServiceProxy
access = ServiceProxy("http://user:pass@127.0.0.1:8332")
print access.getinfo()
但在围棋中,我似乎遇到了错误,比如“没有这样的主人”。我尝试过使用rpc和rpc/jsonrpc两个包,使用方法Dial和DialHTTP,使用各种网络参数,但仍然一无所获
那么,如何在Go中正确地调用JSON-RPC服务器呢?该包目前不支持HTTP上的JSON RPC。所以,你不能用那个,对不起
但是这个包非常简单,而且编写自己的jsonrpchttp
(哦,我希望您知道一个更好的名称)包可能非常容易
我能够使用以下(可怕的)代码成功地调用“getinfo”:
也许您可以通过实现接口来清理它(参见示例)。然后你可以利用Go的套餐 这不是解决你问题的办法吗?不,这只解决了问题的一部分,我认为,我仍然会得到错误的“没有这样的主机”和其他取决于我尝试了许多不同的配置。这就是为什么我会喜欢一些工作代码,因为检查选项,例如是否在地址中放置“http://”,使用哪个网络,是否使用rpc或jsonrpc,是否调用拨号或拨号http会产生太多的选项,无法尝试和调整所有这些选项。嗯,您似乎有一些旧的导入将“encoding/json”更改为“json”,并且“net/http”到“http”“不用说了,非常感谢!至于编写我自己的库,我很想这样做,但我认为我不明白jsonrpc包应该放在哪里。也许应该启动一些回购协议,因为正如我所看到的,有几个人有同样的问题。我现在正在使用最新的提示。当Go 1发布后,这些进口将很快改变。顺便说一句,我也提交了一份关于这个即时问题跟踪器的bug报告,但是优先级被改为“稍后”,所以现在一个单独的包可能是个好主意。用服务器实现更新了代码。虽然我对rpc编解码器了解不多,但我的实现稍微基于http包(注册要为特定方法调用的函数,然后执行它们)。
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)
}