2012-01-18 10 views
6

Git'te a simple JSON-RPC server for Bitcoin numaralı telefonu aramak için çeşitli yapılandırmalar deniyorum, ancak hiçbir yere gitmeyi başaramadım. Git'de JSON-RPC nasıl düzgün çağrılabilir?

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

Ama Git

, ben "too many colons in address" gibi Standardizasyon ve Kalibrasyon çarpıp gibi görünüyor, ya da "böyle bir ana bilgisayar":

Python, tüm kod benziyor. Çeşitli ağ parametrelerini kullanarak Dial ve DialHTTP yöntemlerini kullanarak rpc ve rpc/jsonrpc paketlerinin her ikisini de denedim ve hala hiçbir yere ulaşamıyorum.

Peki, bir JSON-RPC sunucusunu Go'da nasıl düzgün arayabilirim?

+0

bu sizin sorununuz çözümü değil miydi? http://stackoverflow.com/questions/8854682/go-json-rpc-too-many-colons – thwd

+0

Hayır, sanırım sorunun sadece bir parçasını çözdüm, hala "böyle bir ev sahibi" ve diğer olanlar için hata alıyorum denediğim farklı konfigürasyonlardan hangisine bağlı olarak. Bu yüzden, bazı çalışma kodlarını takdir ediyorum çünkü adreste "http: //" ifadesinin kullanılıp kullanılmayacağı, hangi şebekenin kullanılacağı, rpc veya jsonrpc kullanılıp kullanılmayacağı, Dial veya DialHTTP aramasının çok fazla yol alması gibi seçenekler kontrol ediliyor hepsini denemek ve düzeltmek için seçenekler. – ThePiachu

+0

Bize kodu göster! – Mostafa

cevap

9

jsonrpc paketi şu an için json-rpc'yi HTTP üzerinden desteklememektedir. Yani, bunu kullanamazsın, üzgünüm.

jsonrpc specification Ancak oldukça basittir ve muhtemelen kendi jsonrpchttp (oh, umarım daha iyi bir ad biliyorsanız) paketini yazmanız oldukça kolaydır.

Ben başarıyla aşağıdaki (korkunç) kodunu kullanarak "Getınfo" dediğimiz başardı:
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) 
} 

Belki rpc.ClientCodec arabirimini (bir örnek için jsonrpc/client.go bakınız) uygulayarak biraz o kadar temizleyebilir. Daha sonra Go'nun rpc paketinden yararlanabilirsiniz.

+0

Hmm, biraz eski - "kodlama/json" - "json" ve "net/http" ile "http" arasında değişen bazı eski ithalatlarınız var gibi görünüyor. Aside, çok teşekkürler! Kendi kütüphanemi yazarken, bunu yapmak isterdim, ama jsonrpc paketinde nereye gitmesi gerektiğini anladığımı sanmıyorum. Muhtemelen bir miktar repo almalıyım, çünkü aynı problemi olan bir çift insan olduğunu görebiliyorum. – ThePiachu

+0

Tamam, ilk github repo hazır - https://github.com/ThePiachu/Go-HTTP-JSON-RPC/ – ThePiachu

+0

Şu anda en son ipucunu kullanıyorum. Bu ithalatlar, Go 1 serbest bırakıldığında çok yakında değişecek. Btw, Go sorunu izleyicisinde bunun için bir hata raporu gönderdim, ancak öncelik "Daha Sonra" olarak değiştirildi, bu nedenle ayrı bir paket şu anda iyi bir fikir olabilir. – tux21b

İlgili konular