2010-02-01 77 views
0

我试图使用fql_query获取登录的名字。facebook-java-api:fql_query返回null

我尝试以下代码:

import java.io.IOException; 
import java.io.PrintWriter; 
import java.util.ArrayList; 
import javax.servlet.http.*; 
import javax.servlet.*; 
import org.w3c.dom.Document; 

import com.google.code.facebookapi.FacebookException; 
import com.google.code.facebookapi.FacebookWebappHelper; 
import com.google.code.facebookapi.FacebookXmlRestClient; 
import com.google.code.facebookapi.IFacebookRestClient; 
import org.json.JSONException; 


public class Canvas extends HttpServlet { 

    private static final String FACEBOOK_USER_CLIENT = "facebook.user.client"; 
    private String api_key=<API_KEY>; 
    private String secret=<SECRET>; 


    @Override 
    public void doGet (HttpServletRequest req, 
            HttpServletResponse res) 
    throws ServletException, IOException 
    { 
        HttpServletRequest request = (HttpServletRequest)req; 
        HttpServletResponse response = (HttpServletResponse)res; 

        HttpSession session = request.getSession(true); 
        IFacebookRestClient<Document> userClient = getUserClient(session); 
        if(userClient == null) { 
         // logger.debug("User session doesn't have a Facebook API client setup yet. Creating one and storing it in the user's session."); 
         userClient = new FacebookXmlRestClient(api_key, secret); 
         session.setAttribute(FACEBOOK_USER_CLIENT, userClient); 
        } 
FacebookWebappHelper<Document> facebook = new FacebookWebappHelper<Document>(request,  response, api_key, secret, userClient); 
        String nextPage = request.getRequestURI(); 
        nextPage = nextPage.substring(nextPage.indexOf("/", 1) + 1); //cut out the first /, the context path and the 2nd/
      //  logger.trace(nextPage); 
        boolean redirectOccurred = facebook.requireLogin(nextPage); 
        if(redirectOccurred) { 
          return; 
        } 
        redirectOccurred = facebook.requireFrame(nextPage); 
        if(redirectOccurred) { 
          return; 
        } 

        long facebookUserID; 
        try { 
         facebookUserID = userClient.users_getLoggedInUser(); 
        } catch(FacebookException ex) { 
         response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "Error while fetching user's facebook ID"); 
/*       logger.error("Error while getting cached (supplied by request params) value " + 
             "of the user's facebook ID or while fetching it from the Facebook service " + 
             "if the cached value was not present for some reason. Cached value = {}", userClient.getCacheUserId());*/ 
         return; 
        } 
         PrintWriter out = res.getWriter(); 
     String query = "Select name from user where uid=" + facebookUserID; 
     Document fqlDocument=null; 
     try { 
     fqlDocument = userClient.fql_query(query); 
     } catch (FacebookException e) { 
      out.println("error"); 
     } 
    out.println("Hello, Brave new World: " + facebookUserID + " " + fqlDocument); 
    out.close(); 



    } 
    public static FacebookXmlRestClient getUserClient(HttpSession session) { 
     return (FacebookXmlRestClient)session.getAttribute(FACEBOOK_USER_CLIENT); 
    } 

}

所得输出是:

Hello, Brave new World: <MY_UID>[#document: null] 

我放心,我接收到的UID是正确的。 使用facebook-java-api 3.0.2(最新版本)

  1. 为什么我从查询中得到一个空文档?
  2. 为什么查询在出现问题时不会抛出任何相关异常?
  3. 这是我在网上找到的代码,有没有更好的方法来实现我的目标?

谢谢你的一切!

我在这个学科真的很新,所以我对任何不相关的问题或主题的信息表示歉意。

+0

也没找到答案了,要去尝试,而不是Java API的客户端TinyFbClient。也许我会有更好的运气 – ufk 2010-02-02 13:57:28

回答

0

我通过使用TinyFBClient而不是facebook-java-api解决了问题。

tinyFbClient允许发送实际的facebook api命令,它允许我在不使用fql查询的情况下为我的应用程序获取所有相关信息。

Facebook的API:http://wiki.developers.facebook.com/index.php/API

tinyFBClient:

代码示例:

HttpServletRequest request = (HttpServletRequest)req; 
String sessionKey = request.getParameter("fb_sig_session_key"); 
TinyFBClient fb = new TinyFBClient(this.api_key,this.secret,sessionKey); 
TreeMap tm = new TreeMap(); 

tm.put("uid",""); 

String friendList = fb.call("friends.get", tm); 

PrintWriter out = res.getWriter(); 
out.println(friendList); 

out.close(); 

}