2012-01-18 14 views
6

Ho provato varie configurazioni per chiamare a simple JSON-RPC server for Bitcoin in Go, ma non sono riuscito ad arrivare da nessuna parte.Come chiamare correttamente JSON-RPC in Go?

In Python, l'intero codice è simile:

from jsonrpc import ServiceProxy 
access = ServiceProxy("http://user:[email protected]:8332") 
print access.getinfo() 

Ma in Go, mi sembra di essere a sbattere contro erros come "too many colons in address", o "no come host". Ho provato ad usare entrambi i pacchetti rpc e rpc/jsonrpc, usando i metodi Dial e DialHTTP, usando vari parametri di rete e ancora non posso arrivare da nessuna parte.

Quindi, come si chiama correttamente un server JSON-RPC in Go?

+0

non era questa la soluzione al tuo problema? http://stackoverflow.com/questions/8854682/go-json-rpc-too-many-colons – thwd

+0

No, questo ha risolto solo una parte del problema, credo, ricevo ancora l'errore "no host di questo tipo" e altri a seconda di quale delle diverse configurazioni ho provato. Questo è il motivo per cui apprezzerei un codice funzionante, come opzioni di controllo come se inserire "http: //" nell'indirizzo, quale rete usare, se usare rpc o jsonrpc, se chiamare Dial o DialHTTP produce troppi opzioni per provare e modificare tutti loro. – ThePiachu

+0

Mostraci il codice! – Mostafa

risposta

9

Il pacchetto jsonrpc non supporta json-rpc su HTTP al momento. Quindi, non puoi usarlo, mi dispiace.

Ma il jsonrpc specification è piuttosto semplice ed è probabilmente abbastanza facile scrivere il proprio pacchetto jsonrpchttp (oh, spero che tu conosca un nome migliore).

sono stato in grado di chiamare "getinfo" con successo utilizzando il seguente codice (orribile):

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:[email protected]: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) 
} 

forse si può ripulire un po 'implementando l'interfaccia rpc.ClientCodec (vedi jsonrpc/client.go per un esempio). Quindi puoi usufruire del pacchetto rpc di Go.

+0

Hmm, sembra che alcune vecchie importazioni siano leggermente cambiate: "codifica/json" in "json" e "net/http" in "http". A parte questo, grazie mille! Per quanto riguarda la scrittura della mia libreria, beh, mi piacerebbe farlo, ma non credo di capire cosa dovrebbe andare dove nel pacchetto jsonrpc. Probabilmente dovrebbe iniziare un po 'di repo, dato che, come posso vedere, ci sono un paio di persone che hanno lo stesso problema. – ThePiachu

+0

Ok, il repository github iniziale è attivo - https://github.com/ThePiachu/Go-HTTP-JSON-RPC/ – ThePiachu

+0

Attualmente sto utilizzando l'ultimo suggerimento al momento. Quelle importazioni cambieranno presto quando verrà rilasciato Go 1. A proposito, ho anche presentato un bug report per questo sul tracker di problemi di Go, ma la priorità è stata cambiata in "Più tardi", quindi un pacchetto separato potrebbe essere una buona idea al momento. – tux21b