我试图通过网络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的调用超出了速率限制
如果它不在浏览器中工作
答案 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());
谢谢!