2011-02-08 17 views
19

Estoy tratando de conectarme a una URL desde una aplicación de escritorio, y aparece el error indicado en el título de mi pregunta, pero cuando intenté conectarme a la misma URL del servlet, todo funciona bien. Cuando cargo la URL desde el navegador, todo funciona bien. Estoy usando el mismo código en el servlet. El código estaba en una biblioteca, cuando no funcionaba, saqué el código a una clase en el proyecto actual, pero no funcionó.URLConnection Error - java.io.IOException: El servidor devolvió el código de respuesta HTTP: 400 para la dirección URL

La URL https://graph.facebook.com/me.

El fragmento de código.

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(); 
} 

Estoy un poco confundido aquí, ¿hay algo que esté presente es un servlet que no es una aplicación de escritorio normal?

Gracias.

pila completa TRACE

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) 
+0

Sospecho que Https puede causar problemas. Pero proporcione su excepción completa stacktrace – Bozho

Respuesta

4

Finalmente encontré el problema. Por supuesto es mi código. Una parte del código que no publiqué es el valor de los datos. los datos solo deben contener el nombre y la descripción, pero estoy aprobando más que el nombre y la descripción.

50

EDIT: Es necesario encontrar el mensaje de error exacto que Facebook está enviando en la respuesta Puede modificar el código para obtener el mensaje de la corriente de error de este modo:

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

Tome un vistazo a cómo se está pasando el contexto de usuario He aquí alguna información que podría ayudarle a cabo:

mirada en el mensaje de error detrás del código de respuesta 400:

"Plataforma Facebook" "INVALID_REQUEST" "Un token de acceso activo debe ser utilizado para consultar la información sobre el usuario actual *

Encontrará el solución here

 
HTTP/1.1 400 Bad Request 
... 
WWW-Authenticate: OAuth "Facebook Platform" "invalid_request" "An active access token must be used to query information about the current user." 
... 
+0

Estoy pasando el mismo token que el que estoy pasando en el servlet. Estoy seguro de que el token es correcto porque lo usé para cargar la URL en el navegador. Aunque aprecio tu comentario. Estoy pensando que tal vez Facebook trata las solicitudes de aplicaciones de escritorio y aplicaciones web de manera diferente, o algo así. –

+0

actualizó la respuesta; debe echar un vistazo a la secuencia de errores para obtener el mensaje exacto enviado por el servicio de Facebook –

+1

@RyanFernandes, debería ser lo opuesto: if (httpConn.getResponseCode()> = 400) { is = httpConn.getErrorStream(); } else { es = httpConn.getInputStream(); } – Pashok

Cuestiones relacionadas