2009-09-29 4 views
8

J'utilise Apache HttpComponents Client pour POST sur un serveur qui renvoie JSON. Le problème est que si le serveur renvoie une erreur 400, il semble que je n'ai aucun moyen de dire quelle erreur il a eu de Java (il a dû recourir à un sniffer de paquets jusqu'à présent - ridicule). Voici le code:Comment puis-je obtenir l'erreur réelle derrière HttpResponseException?

HttpClient httpclient = new DefaultHttpClient(); 
params.add(new BasicNameValuePair("format", "json")); 
params.add(new BasicNameValuePair("foo", bar)); 

HttpPost httppost = new HttpPost(uri); 
// this is how you set the body of the POST request 
httppost.setEntity(new UrlEncodedFormEntity(params, "UTF-8")); 

String responseBody = ""; 
try { 
    // Create a response handler 
    ResponseHandler<String> responseHandler = new BasicResponseHandler(); 
    responseBody = httpclient.execute(httppost, responseHandler); 
} catch(HttpResponseException e) { 
    String error = "unknown error"; 
    if (e.getStatusCode() == 400) { 
     // TODO responseBody and e.detailMessage are null here, 
     // even though packet sniffing may reveal a response like 
     // Transfer-Encoding: chunked 
     // Content-Type: application/json 
     // 
     // 42 
     // {"error": "You do not have permissions for this operation."} 
     error = new JSONObject(responseBody).getString("error"); // won't work 
     } 
    // e.getMessage() is "" 
} 

Qu'est-ce que je fais mal? Il doit y avoir un moyen facile d'obtenir le message d'une erreur 400. C'est élémentaire.

Répondre

12

Pourquoi utilisez-vous BasicResponseHandler()? Le gestionnaire le fait pour vous. Ce gestionnaire n'est qu'un exemple et ne devrait pas être utilisé en code réel.

Vous devez soit écrire votre propre gestionnaire, soit appeler sans exécuter de gestionnaire.

Par exemple,

 HttpResponse response = httpClient.execute(request); 
     int statusCode = response.getStatusLine().getStatusCode(); 
     HttpEntity entity = response.getEntity(); 
     responseBody = entity.getContent(); 

     if (statusCode != 200) { 
      // responseBody will have the error response 
     } 
+0

Cela a fonctionné; Merci. Tout ce qui restait était de slurp le responseBody InputStream dans une chaîne. –

+1

Vous pouvez utiliser EntityUtils.toString (entity) pour le convertir en chaîne. Il gère la conversion de caractères pour vous. BTW, erreur JSON devrait être de retour avec 200. Sinon, vous ne pouvez pas obtenir de réponse du navigateur. –

+0

aidez s'il vous plaît ici - http://stackoverflow.com/questions/1490341/how-can-i-get-the-actual-error-behind-httpresponseexception –

1

responseBody sera toujours nul si une exception est levée lors de l'affectation d'une valeur. En outre, c'est le comportement spécifique de l'implémentation - Apache HttpClient.

Il semble qu'il ne conserve aucune information détaillée dans l'exception (évidemment).

Je voudrais charger le code source pour HttpClient et déboguer cela.

mais vérifiez d'abord s'il y a quelque chose dans le e.getCause() ...

espoir qui aide.

+0

rappelez-vous, il est open source - vous pouvez toujours le modifier ou y contribuer, si vous avez besoin. – pstanton

+0

e.getCause() renvoie la valeur null. Je sais que c'est open source mais je suis un débutant à Java et c'est la fonctionnalité la plus basique qu'on peut imaginer pour une bibliothèque HTTP Client: donnez-moi l'erreur –

+0

content que vous avez trouvé une réponse (ci-dessus) – pstanton

Questions connexes