|
|
- package rpcclient
-
- import (
- "bytes"
- "encoding/json"
- "errors"
- "io/ioutil"
- "net/http"
-
- . "github.com/tendermint/go-common"
- "github.com/tendermint/go-wire"
- . "github.com/tendermint/tendermint/rpc/types"
- )
-
- func Call(remote string, method string, params []interface{}, dest interface{}) (interface{}, error) {
- // Make request and get responseBytes
- request := RPCRequest{
- JSONRPC: "2.0",
- Method: method,
- Params: params,
- ID: "",
- }
- requestBytes := wire.JSONBytes(request)
- requestBuf := bytes.NewBuffer(requestBytes)
- log.Info(Fmt("RPC request to %v: %v", remote, string(requestBytes)))
- httpResponse, err := http.Post(remote, "text/json", requestBuf)
- if err != nil {
- return dest, err
- }
- defer httpResponse.Body.Close()
- responseBytes, err := ioutil.ReadAll(httpResponse.Body)
- if err != nil {
- return dest, err
- }
- log.Info(Fmt("RPC response: %v", string(responseBytes)))
-
- // Parse response into JSONResponse
- response := RPCResponse{}
- err = json.Unmarshal(responseBytes, &response)
- if err != nil {
- return dest, err
- }
- // Parse response into dest
- resultJSONObject := response.Result
- errorStr := response.Error
- if errorStr != "" {
- return dest, errors.New(errorStr)
- }
- dest = wire.ReadJSONObject(dest, resultJSONObject, &err)
- return dest, err
- }
|