【问题标题】:Fail to Facebook api request using URLConnection in JAVA在 JAVA 中使用 URLConnection 向 Facebook api 请求失败
【发布时间】:2013-11-09 20:02:24
【问题描述】:

我正在尝试使用 Java 开发 Facebook API。

以流的形式从facebook获取access_token是成功的。

        String access_token_url = targetURI +
                "client_id=" + appId +
                "&client_secret=" + appSecret +
                "&code=" + code +
                "&redirect_uri=" + redirectURI; // 호출되지 않음

        URL url = new URL (access_token_url);
        URLConnection urlConn = url.openConnection();
        BufferedReader in = new BufferedReader(new InputStreamReader(urlConn.getInputStream()));
        String accessTokenStr="";

        while ((accessTokenStr=in.readLine()) != null) {                
            int endPnt = accessTokenStr.indexOf("&");
            access_token = accessTokenStr.substring(13, endPnt);
            System.out.println("@@@@@@@@@@@@@ access_token = " + access_token);
        }
        in.close();

这个案例(见下面的源代码)发生异常(代码:400)使用上面的access_token获取自己的信息。

        String access_userInfo_url = "https://graph.facebook.com/me?" + "access_token=" + access_token;

        System.out.println("@@@@@@@@@@@ access_userInfo_url==============" + access_userInfo_url); 

        URL url = new URL (access_userInfo_url);
        HttpURLConnection urlConn = (HttpURLConnection) url.openConnection();
        BufferedReader input = new BufferedReader(new InputStreamReader(urlConn.getInputStream()));

        urlConn.setRequestMethod("GET");
        //urlConn.setConnectTimeout(1000);
        //urlConn.setReadTimeout(1000);
        //urlConn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
        //urlConn.setRequestProperty("Content-Length", String.valueOf(access_userInfo_url.length()));              

        String userInfoStr="";          
        while ((userInfoStr=input.readLine()) != null) {
            System.out.println("@@@@@@@@@@@@@ userInfoStr = " + userInfoStr);   
        }

        input.close();

收到异常消息作为流。

java.io.IOException:服务器返回 HTTP 响应代码:400 用于 URL:https://graph.facebook.com/me?access_token=CAAC7APV7WpoBAHVfr2ChZAK4wVrQZCjNSbro3LgABvoFSMMSHmiloS5m95z3DCeNsZBoOHFsClrgBVIqZCCwg8JZCK3Xd0fq6uyu8GJbYNENFQCDKz25IsguBSXuReapPvZA3ZC3BuJVLPwpZAfVCZCqFW0wj6o6ZA6nXO5JzCutZBAum2cJQjiBwctFkzxWqxinz8ZD 在 sun.net.www.protocol.http.HttpURLConnection.getInputStream(未知来源) 在 sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(未知来源) 在 biztopia.facebook.web.FacebookController.requestUserInfo(FacebookController.java:318) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(未知来源) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(未知来源) 在 java.lang.reflect.Method.invoke(未知来源)

~ ~ ~ ~

我很困惑,当网络浏览器(资源管理器)上的请求为“https://graph.facebook.com/me?access_token=Token value”时它是成功的。

请有解决方案的帮帮我。

【问题讨论】:

    标签: java facebook access-token urlconnection


    【解决方案1】:

    这样做:

    public String getUserInfo(String access_token) throws MalformedURLException, ProtocolException, IOException {
        try {
            String connection = connectionGet("https://graph.facebook.com/me?access_token=" + access_token, "");
            return connection;
        } catch (Exception e) {
            return null;
        }
    }
    
    
    public static String connectionGet(String url, String parameter) throws MalformedURLException, ProtocolException, IOException {
    
        URL url1 = new URL(url);
        HttpURLConnection request1 = (HttpURLConnection) url1.openConnection();
        request1.setRequestMethod("GET");
        request1.connect();
        String responseBody = convertStreamToString(request1.getInputStream());
        return responseBody;
    }
    
      private static String convertStreamToString(InputStream is) {
        BufferedReader reader = new BufferedReader(new InputStreamReader(is));
        StringBuilder sb = new StringBuilder();
        String line = null;
        try {
            while ((line = reader.readLine()) != null) {
                sb.append(line).append("\n");
            }
        } catch (IOException e) {
        } finally {
            try {
                is.close();
            } catch (IOException e) {
            }
        }
    
        return sb.toString();
    }
    

    必要的导入将是:

     import java.io.BufferedReader;
     import java.io.IOException;
     import java.io.InputStream;
     import java.io.InputStreamReader;
     import java.net.HttpURLConnection;
     import java.net.MalformedURLException;
     import java.net.ProtocolException;
     import java.net.URL;
    

    【讨论】:

    • 感谢詹维!我尝试了你的解决方案,不幸的是结果是一样的。
    • java.io.IOException: 服务器返回 HTTP 响应码:400 ~ ~ ~ ~ ~
    • 把这个粘贴到你的浏览器上:graph.facebook.com/…。你有什么收获吗?
    • 执行成功!以 JSON 格式返回我的 infoamtion 文件。这是我的困惑。
    • 你试过我的确切代码了吗?因为我使用的是相同的并且它有效。 ??
    【解决方案2】:

    我找到了解决方案。 即在调用 API 中附加 appsecret_proof 参数为“http://graph.facebook.com/me?access_token={access_token value}$appsecret_proof={appsecret_proof value}。

    如果您不想附加 appsecret_proof 参数,那么您可以在您的应用管理网站上将设置更改为不使用 appsecret_proof 参数。 管理站点菜单正在设置>高级>需要 AppSecret Proof for Server API 调用 -> 设置为禁用。

    【讨论】:

      猜你喜欢
      • 2013-11-12
      • 1970-01-01
      • 2017-04-27
      • 1970-01-01
      • 1970-01-01
      • 2021-11-04
      • 2011-01-02
      • 2018-12-10
      • 1970-01-01
      相关资源
      最近更新 更多