英文:
GAE Golang - HTTP JSON RPC call works in the dev_appserver, but not on the App Engine?
问题
我正在创建一个Go Google App Engine应用程序,它将对Bitcoin服务器进行HTTP JSON RPC调用。我已经成功地在dev_appserver上使我的代码正常工作,但是在部署到GAE上时,代码似乎无法工作。我使用了一个在GitHub上可用的库,并像这样调用它:
func GetInfo(id interface{})(map[string]interface{}, os.Error){
resp, err:=httpjsonrpc.Call("user:pass@111.1.1.1:18332", "getinfo", id, nil)
if err!=nil{
log.Println(err)
return resp, err
}
return resp, err
}
调用时应该返回:
map[proxy: keypoololdest:1.327368259e+09 blocks:45385 keypoolsize:101 connections:11 version:50200 difficulty:8.88353262 generate:false hashespersec:0 paytxfee:0 balance:0 genproclimit:-1 testnet:true errors:]
但是在GAE上调用该函数似乎会导致错误。代码的哪一部分可能在dev_appserver上工作正常,但在GAE上失败?
1: https://en.bitcoin.it/wiki/API_reference_%28JSON-RPC%29
2: https://github.com/ThePiachu/Go-HTTP-JSON-RPC/blob/master/httpjsonrpc/httpjsonrpcClient.go
英文:
I'm creating a Go Google App Engine application that will be making HTTP JSON RPC calls to a Bitcoin server. I got my code to work properly on the dev_appserver, but when deployed on GAE, the code seems to not work. I'm using a library available on GitHub, and call it like this:
func GetInfo(id interface{})(map[string]interface{}, os.Error){
resp, err:=httpjsonrpc.Call("user:pass@111.1.1.1:18332", "getinfo", id, nil)
if err!=nil{
log.Println(err)
return resp, err
}
return resp, err
}
Which when called should give:
map[proxy: keypoololdest:1.327368259e+09 blocks:45385 keypoolsize:101 connections:11 version:50200 difficulty:8.88353262 generate:false hashespersec:0 paytxfee:0 balance:0 genproclimit:-1 testnet:true errors:]
But on GAE calling the function seems to be causing an error. What part of the code could be working on dev_appserver, but fail on GAE?
1: https://en.bitcoin.it/wiki/API_reference_%28JSON-RPC%29
2: https://github.com/ThePiachu/Go-HTTP-JSON-RPC/blob/master/httpjsonrpc/httpjsonrpcClient.go
答案1
得分: 3
你应该在生产环境中使用urlfetch.Transport
来进行HTTP调用,具体请参考urlfetch文档。
不要使用以下方式:
resp, err := http.Post(address,
"application/json", strings.NewReader(string(data)))
而应该使用以下方式:
client := urlfetch.Client(context)
resp, error := client.Post(address,
"application/json", strings.NewReader(string(data)))
如你在实现中所见,urlfetch.Client
只是一个快捷方式,用于构建使用urlfetch.Transport
的http.Client
。
英文:
You should make you are using urlfetch.Transport
to make HTTP calls in production as described in urlfetch documentation.
Instead of doing:
resp, err := http.Post(address,
"application/json", strings.NewReader(string(data)))
You should be doing:
client := urlfetch.Client(context)
resp, error := client.Post(address,
"application/json", strings.NewReader(string(data)))
As you can see in the implementation, urlfetch.Client
is just a shortcut to construct an http.Client
that uses urlfetch.Transport
.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论