【问题标题】:URLConnection Error - java.io.IOException: Server returned HTTP response code: 400 for URLURLConnection 错误 - java.io.IOException:服务器返回 HTTP 响应代码:URL 为 400
【发布时间】:2011-02-08 08:57:21
【问题描述】:

我正在尝试从桌面应用程序连接到 URL,并且我收到问题标题中指示的错误,但是当我尝试从 servlet 连接到相同的 URL 时,一切正常。当我从浏览器加载 URL 时,一切正常。我在 servlet 中使用相同的代码。代码在库中,当它不起作用时,我将代码拉到当前项目中的一个类中,但它不起作用。

网址https://graph.facebook.com/me。

代码片段。

public static String post(String urlSpec, String data) throws Exception {
    URL url = new URL(urlSpec);
    URLConnection connection = url.openConnection();
    connection.setDoOutput(true);
    OutputStreamWriter writer = new OutputStreamWriter(connection.getOutputStream());
    writer.write(data);
    writer.flush();

    BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
    String line = "";
    StringBuilder builder = new StringBuilder();
    while((line = reader.readLine()) != null) {
        builder.append(line);
    }
    return builder.toString();
}   

我在这里有点困惑,是否存在不是普通桌面应用程序的 servlet?

谢谢。

完整的堆栈跟踪

Feb 8, 2011 9:54:14 AM com.trinisoftinc.jiraffe.objects.FacebookAlbum create
SEVERE: null
java.io.IOException: Server returned HTTP response code: 400 for URL: https://graph.facebook.com/me
        at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1313)
        at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:234)
        at com.jiraffe.helpers.Util.post(Util.java:49)
        at com.trinisoftinc.jiraffe.objects.FacebookAlbum.create(FacebookAlbum.java:211)
        at com.trinisoftinc.jiraffe.objects.FacebookAlbum.main(FacebookAlbum.java:261)

【问题讨论】:

  • 我怀疑 Https 会导致问题。但是给你完整的异常堆栈跟踪

标签: java url https


【解决方案1】:

编辑:您需要找到 facebook 在响应中发送的确切错误消息 您可以修改代码以从错误流中获取消息,如下所示:

HttpURLConnection httpConn = (HttpURLConnection)connection;
InputStream is;
if (httpConn.getResponseCode() >= 400) {
    is = httpConn.getErrorStream();
} else {
    is = httpConn.getInputStream();
}

看看你是如何传递用户上下文的 以下是一些可以帮助您的信息:

查看400响应码背后的错误信息:

"Facebook Platform" "invalid_request" "查询当前用户信息必须使用主动访问令牌*

你会找到解决方案here

HTTP/1.1 400 错误请求 ... " WWW-Authenticate: OAuth "Facebook Platform" "invalid_request" "必须使用活动访问令牌来查询有关当前用户的信息。" ...

【讨论】:

  • 我传递的令牌与传递 Servlet 的令牌相同。我确定令牌是正确的,因为我用它在浏览器上加载 URL。不过,我很欣赏你的评论。我在想 Facebook 可能会以不同的方式处理桌面和 Web 应用程序请求,或者类似的东西。
  • 更新了答案;您应该查看错误流以获取 facebook 服务发送给您的确切消息
  • @RyanFernandes 它应该是相反的: if (httpConn.getResponseCode() >= 400) { is = httpConn.getErrorStream(); } else { 是 = httpConn.getInputStream(); }
  • 这是次要的,但像这样检查可能有点“干净”:if (httpConn.getResponseCode >= HttpURLConnection.HTTP_BAD_REQUEST) 只是一个想法。
  • 用正确的方式更新了错误/输入流的答案(参见 Pashok 之前的评论)。
【解决方案2】:

我终于找到了问题所在。当然,这是我的代码。我没有发布的代码的一部分是数据的价值。数据必须只包含名称和描述,但我传递的不仅仅是名称和描述。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-19
    • 2014-02-22
    • 2011-04-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多