2011-02-08 18 views
19

Sto provando a connettermi a un URL da un'app desktop e ottengo l'errore indicato nel titolo della mia domanda, ma quando provato a connettersi allo stesso URL dal servlet, tutto funziona bene. Quando carico l'URL dal browser, tutto funziona correttamente. Sto usando lo stesso codice nel servlet. Il codice era in una libreria, quando non funzionava, ho estratto il codice in una classe del progetto corrente, ma non ha funzionato.Errore URLConnection - java.io.IOException: il server ha restituito il codice di risposta HTTP: 400 per l'URL

L'URL https://graph.facebook.com/me.

Il frammento di codice.

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

Sono un po 'confuso qui, c'è qualcosa che è presente è un servlet che non è una normale applicazione desktop?

Grazie.

stack completo 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

Sospetto che Https possa causare problemi. Ma dai la tua piena eccezione stacktrace – Bozho

risposta

4

Ho finalmente trovato il problema. Certo che è il mio codice. Una parte del codice che non ho pubblicato è il valore dei dati. i dati devono contenere solo nome e descrizione, ma sto passando più di un nome e una descrizione.

50

EDIT: Hai bisogno di trovare il messaggio di errore esatto che Facebook sta inviando nella risposta È possibile modificare il codice per ottenere il messaggio dal flusso di errore in questo modo:

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

Date un'occhiata a come si sta passando il contesto dell'utente Ecco alcune informazioni che potrebbero aiutarvi:

Guardate il messaggio di errore dietro il codice 400 di risposta:

"Facebook Platform" "invalid_request" "Un token di accesso attivo deve essere utilizzato per interrogare le informazioni sull'utente corrente *

Troverete il soluzione 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

Sto passando lo stesso token che sto passando nel Servlet. Sono sicuro che il token è corretto perché l'ho usato per caricare l'URL sul browser. Apprezzo comunque il tuo commento. Penso che Facebook possa trattare le richieste Desktop e Web Apps in modo diverso, o qualcosa del genere. –

+0

ha aggiornato la risposta; dovresti sbirciare nel flusso degli errori per ottenere il messaggio esatto inviato dal servizio di Facebook –

+1

@RyanFernandes, dovrebbe essere il contrario: if (httpConn.getResponseCode()> = 400) { is = httpConn.getErrorStream(); } else { is = httpConn.getInputStream(); } – Pashok

Problemi correlati