2010-06-14 4 views
1

Lorsque je contacte un service Web à l'aide d'une connexion HttpUrlConnection Java, il renvoie juste une 400 Bad Request (IOException). Comment obtenir les informations XML renvoyées par le serveur? il ne semble pas être dans le getErrorStream de la connexion ni dans aucune des informations d'exception.Java erreurs getInputStream 400

Quand je lance le code PHP suivant contre un service Web:

<?php 

$ch = curl_init(); 

curl_setopt($ch, CURLOPT_URL, "https://www.myclientaddress.com/here/"); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLOPT_POST,1); 
curl_setopt($ch, CURLOPT_POSTFIELDS,"username=ted&password=scheckler&type=consumer&id=123456789&zip=12345"); 

$result=curl_exec ($ch); 
echo $result; 
?> 

il renvoie les éléments suivants:

<?xml version="1.0" encoding="utf-8"?> 
<response> 
    <status>failure</status> 
    <errors> 
     <error name="RES_ZIP">Zip code is not valid.</error> 
     <error name="ZIP">Invalid zip code for residence address.</error> 
    </errors> 
</response> 

donc je sais que l'information existe

Répondre

0

Si le serveur est de retour XML et vous passez les paramètres en tant qu'URL, pourquoi ne pas simplement utiliser une bibliothèque qui prend en charge JAX-RS (Java REST webservices API), tels que Apache CXF?

Je sais qu'il supporte JAX-RS parce qu'il a un chapter dans le manuel.

+0

Je n'étais pas impliqué dans la conception du système, donc je ne peux pas répondre à cette question. Cela dépend aussi du client, certains retournent du texte en retour. Indépendamment de cela, la connexion ne supporte-t-elle pas simplement le retour brut? – threadhack

0

J'ai eu le même problème et l'ajout ci-dessous deux lignes l'a résolu.

httpConn.setRequestProperty ("Connexion", "Fermer"); System.setProperty ("http.keepAlive", "false");

1

HttpURLConnection retourne FileNotFoundException si vous essayez de lire le getInputStream() de la connexion, de sorte que vous devriez utiliser getErrorStream() chaque fois que le code d'état est égal ou supérieur à 400.

Plus que cela, s'il vous plaît faites attention comme il n'est pas seulement 200 pour être le code de statut de succès, même 201, 204, etc. sont souvent utilisés comme des états de succès.

Voici un exemple de la façon dont je suis allé à le gérer

// ... connection code code code ... 

// Get the response code 
int statusCode = connection.getResponseCode(); 

InputStream is = null; 

if (statusCode >= 200 && statusCode < 400) { 
    // Create an InputStream in order to extract the response object 
    is = connection.getInputStream(); 
} 
else { 
    is = connection.getErrorStream(); 
} 

// ... callback/response to your handler.... 

De cette façon, vous serez en mesure d'obtenir la réponse nécessaire dans les deux cas de réussite et d'erreur.

Espérons que cela aide!