GAE Golang - HTTP JSON RPC 调用在 dev_appserver 中有效,但在 App Engine 上无效?

Posted

技术标签:

【中文标题】GAE Golang - HTTP JSON RPC 调用在 dev_appserver 中有效,但在 App Engine 上无效?【英文标题】:GAE Golang - HTTP JSON RPC call works in the dev_appserver, but not on the App Engine? 【发布时间】:2012-01-31 04:24:53 【问题描述】:

我正在创建一个 Go Google App Engine 应用程序,它将对 Bitcoin server 进行 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】:

您应该让您使用urlfetch.Transport 在生产环境中进行 HTTP 调用,如urlfetch documentation 中所述。

而不是doing:

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

正如您在implementation 中看到的,urlfetch.Client 只是构造使用urlfetch.Transporthttp.Client 的快捷方式。

【讨论】:

嗯,client.Post 似乎给出了错误“API 错误 1 ​​(urlfetch: INVALID_URL): ApplicationError: 2 (8, 'nodename nor servname provided, or not known')” address的值是多少? 它的格式类似于“user:pass@111.1.1.1:18332”,适用于 http.Post。 我相信 urlfetch.Transport 不会在 url 中解析身份验证,您应该使用 Authorization: 标头代替,请参阅 ***.com/questions/1341081/… 我想这就是问题所在。必须创建一个 http.Request,然后设置基本身份验证,然后才使用 client.Do 执行它。不知道在哪里将 bodyType 设置为“application/json”,但它似乎可以在没有它的情况下工作,至少在开发服务器上。

以上是关于GAE Golang - HTTP JSON RPC 调用在 dev_appserver 中有效,但在 App Engine 上无效?的主要内容,如果未能解决你的问题,请参考以下文章

简单的 GAE Java JSON REST 服务器

SSL:GAE/Go 上的 CERTIFICATE_VERIFY_FAILED

解析 POST json 消息 Django/GAE 的问题

使用 GAE 服务帐户 JSON 密钥

golang http json http://www.alexedwards.net/blog/golang-response-snippets

[Go] golang http下返回json数据