Facebook Graph Java HttpsURLConnection返回错误400

时间:2017-06-28 15:04:42

标签: java facebook facebook-graph-api httpurlconnection inputstreamreader

我试图通过网络API从Facebook Graph下载一些数据,一切正常,直到现在,不知何故,这段代码给了我一个400错误而不是json响应

URL url = new URL(link);
URLConnection urlConn = url.openConnection();

urlConn.setRequestProperty("Content-Type", "application/json");
urlConn.setRequestProperty("Accept-Charset", "UTF-8");
urlConn.setRequestProperty("User-Agent",
            "Mozilla/5.0 (Windows NT 5.1; rv:19.0) Gecko/20100101 Firefox/19.0");

InputStreamReader in = new InputStreamReader(urlConn.getInputStream(), StandardCharsets.UTF_8);
BufferedReader reader = new BufferedReader(in);

当它到达这一行时:

InputStreamReader in = new InputStreamReader(urlConn.getInputStream(), StandardCharsets.UTF_8);

使用以下消息抛出IOException错误:

  

服务器返回HTTP响应代码:400为URL:https://graph.facebook.com/v2.9/sear ...

在Chrome中打开该网址会使网页正常无错误。

- 编辑 -

如果有帮助,请检查标题字段,这是它显示的内容:

  

{Transfer-Encoding = [chunked],x-fb-trace-id = [G1Wlv7GX9w8],   null = [HTTP / 1.1 400 Bad Request],Access-Control-Allow-Origin = [*],   WWW-Authenticate = [OAuth" Facebook平台" " INVALID_REQUEST" "(#613)   对此api的调用超出了速率限制。"],   Connection = [keep-alive],x-fb-rev = [3122154],Pragma = [no-cache],   日期= [2017年6月28日星期三15:26:45 GMT],Cache-Control = [no-store],   Vary = [Accept-Encoding],Expires = [Sat,01 Jan 01 00:00:00 GMT],   X-FB-调试= [ REMOVED ],   facebook-api-version = [v2.9],Content-Type = [application / json;   字符集= UTF-8]}

我会理解

  

对此API的调用超出了速率限制

如果它不在浏览器中工作

2 个答案:

答案 0 :(得分:2)

Facebook有一个速率限制[1],这意味着一个用户无法向API发送过多的调用:

  

您的应用可以合计每位用户每小时拨打200个电话。例如,如果您的应用有100个用户,这意味着您的应用可以拨打20,000个电话。这不是每用户限制,因此一个用户可以拨打19,000个这样的呼叫而另一个用户可以拨打1,000个。此限制是根据前一小时的通话次数计算的。

编辑:

编号613错误是指另一条规则:

  

但是,错误代码:613 - FQL_EC_RATE_LIMIT_EXCEEDED - 呼叫流已超过每600秒100次呼叫的速率

     

指定您每6秒平均可以执行多达1次呼叫。

这意味着此规则可能无法捕获来自浏览器的单个调用,但如果您的代码发送了大量请求,则会失败。

更多信息:

[1] https://developers.facebook.com/docs/graph-api/advanced/rate-limiting

[2] Conflicting limits about maximum number of calls to Facebook API?

答案 1 :(得分:0)

我尝试了您的代码,只要网址正确,它就能正常运行。

例如,当我从URL查询参数中删除access_token时,它给了我错误HTTP 400。

服务器返回HTTP响应代码:400为URL:https://graph.facebook.com/v2.9/me?&debug=all&fields=id,name&format=json&method=get&pretty=0

如果我将& access_token =添加回来,它对我来说就像一个魅力。

希望你能看到这样的事情发生在你身边。

如果您可以共享隐藏访问令牌的绝对URL,我可以进一步调试。

- 编辑 -

请使用此代码调整来打印HTTP 400的原因,以便找出根本原因。

URL url = new URL(link);
    HttpURLConnection  urlConn = (HttpURLConnection) url.openConnection();

    urlConn.setRequestProperty("Content-Type", "application/json");
    urlConn.setRequestProperty("Accept-Charset", "UTF-8");
    urlConn.setRequestProperty("User-Agent",
                "Mozilla/5.0 (Windows NT 5.1; rv:19.0) Gecko/20100101 Firefox/19.0");

    //InputStreamReader in = new InputStreamReader(urlConn.getInputStream());
    InputStreamReader in = null;
    if (urlConn.getResponseCode() < urlConn.HTTP_BAD_REQUEST) {
        in = new InputStreamReader(urlConn.getInputStream());
    } else {
         /* error from server */
        in = new InputStreamReader(urlConn.getErrorStream());
    }


    BufferedReader reader = new BufferedReader(in);
    System.out.println(reader.readLine());

谢谢!