2015-04-06 116 views
0

我有一個通過JSON-RPC服務響應的python服務器。這是來自服務器的示例響應。JSON RPC客戶端轉到

'{"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"}' 

這裏是我的客戶有去語:

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) 
} 

但是,當我運行這個客戶端,它沒有發送任何參數。相反,它發送像這樣的空params:

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

有人可以幫我告訴我正在犯什麼錯誤嗎?我是一個新手去語言。

謝謝。

+0

我懷疑這與jsonrpc和id是小寫的,因此私有的Args結構。如果您正在調用的API需要小寫參數,則可以使用結構標籤來解決該問題 – rob74

+0

非常感謝。這個標籤有助於在一定程度上添加參數,但是,我需要添加標籤到實際的JSON本身 - 如何添加jsonrpc並編輯id值 ''{「method」:「echo」,** 「jsonrpc」:「2.0」**,「params」:[「test_params」],**「id」:「839732f9-cf36-46ff-8b9b-6120250d9ce5」**} – Ganesh

+0

@ rob74或某人請告訴我我如何編輯在JSON RPC請求中傳遞的id值,甚至是將jsonrpc版本與JSON一起添加(jsonrpc 2.0是必需的)? – Ganesh

回答

0

我不知道你在做什麼是可能使用客戶端,通過去提供,因爲私人clientRequest結構當前被定義爲:

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

你傳遞到Callargs什麼扎進Params並注意在該結構中不存在「版本`json:」jsonrpc「`」。

AFAICT(這可能是錯誤的,這是我第一次閱讀這段代碼),你需要實現你自己的ClientCodec。你可能會從stdlib中拷貝大部分(所有)部分,並將該字段添加到上面的clientRequest。 ;-)

+0

謝謝@freeformz – Ganesh