5

我正在使用 Rails 3.2.5 和 Koala 1.3.0(不是最新的,因为最新的甚至拒绝运行 Heroku 的示例 Facebook 应用程序)。Web 服务器是 Unicorn。

当我尝试使用 put_connections() 发布到时间线时:

@fbgraph   = Koala::Facebook::API.new(session[:access_token])
logger.debug "put_connections(#{url_for @room}), start"
@fbgraph.put_connections("me", "myapp:view", :room => url_for(@room))
logger.debug "put_connections(), end"

控制器停顿 12 秒后出现异常:

Completed 500 Internal Server Error in 12075ms

Koala::Facebook::APIError (HTTP 500: Response body: {"error":{"type":"Exception","message":"Could not retrieve data from URL.","code":1660002}}):

我使用调试工具进行了测试:http: //developers.facebook.com/tools/debug ,它发现第 2 行中记录的 URL 没有错误。

我的网络服务器记录来自 Facebook IP 的 GET 并返回 200 OK。然后 Facebook IP 发出更多请求以获取图像,这也获得了 200 OK。

我正在对我的应用程序的测试用户进行测试,仅供参考。

更新

这似乎是一个 OpenGraph 问题。这个问题为我重现:https ://developers.facebook.com/bugs/213733412077729

基本上,只有在我在调试器上测试一次之后,POST 才能成功!以前有人经历过吗?

4

2 回答 2

12

弄清楚了。当然,调试器的事情没有意义。它之所以奏效,是因为 Facebook 然后对他们的缓存有我的看法。

这是一个经典的可重入问题(我不敢相信我必须在 Rails 中处理它!)——Facebook 的 POST API 是同步的,它只在回调到我的显示控制器后才返回。但由于我只有 1 个工作线程,没有人为请求提供服务,因此挂起。

解决方法是在线程中异步调用 API。

Thread.new {
    @fbgraph.put_connections("me", "myapp:view", :room => url_for(@room))
}
于 2012-06-13T09:03:19.737 回答
1

我和你有类似的问题,但是有一个管理超过 600 次 FB 调用的获取请求(总时间 > 16 秒)。

明确声明这些字段似乎有效。

graph = @FBGraph.get_object("#{user.fb_user_id}?fields=id,name,username,picture,link")

有关更多信息,请参阅我在 stackoverflow 中的 Q/A这里

于 2012-12-05T22:24:52.700 回答