6

Goでビットコイン用の単純なJSON-RPCサーバーを呼び出すためにさまざまな構成を試しましたが、どこにも到達できませんでした。

Pythonでは、コード全体は次のようになります。

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

しかし、Goでは、 「アドレス内のコロンが多すぎる」、「そのようなホストがない」などのエラーにぶつかっているようです。私はパッケージrpcとrpc/jsonrpcの両方を使用してみましたが、メソッドDialとDialHTTPを使用し、さまざまなネットワークパラメーターを使用しましたが、それでもどこにも到達できません。

では、GoでJSON-RPCサーバーを適切に呼び出すにはどうすればよいですか?

4

1 に答える 1

11

jsonrpcパッケージは、現時点ではHTTPを介したjson-rpcをサポートしていませんだから、それは使えません、ごめんなさい。

しかし、jsonrpcの仕様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パッケージを利用できます。

于 2012-01-19T10:18:50.913 に答える