J'essaie de faire une demande à un WebService à partir d'une application Android, en utilisant HttpUrlConnection. Mais parfois cela fonctionne, et parfois non.
Lorsque j'essaie d'envoyer cette valeur:
Valeur JSON
{"Calle":"Calle Pérez 105","DetalleDireccion":"","HoraPartida":"May 18, 2014 9:17:10 AM","Numero":0,"PuntoPartidaLat":18.477295994621315,"PuntoPartidaLon":-69.93638522922993,"Sector":"Main Sector"}
J'ai obtenu une exception de "fin de flux inattendue" dans la fonction de fermeture DataOutputStream.
Voici mon code:
DataOutputStream printout;
// String json;
byte[] bytes;
DataInputStream input;
URL serverUrl = null;
try {
serverUrl = new URL(Config.APP_SERVER_URL + URL);
} catch (MalformedURLException e) {
...
}
bytes = json.getBytes();
try {
httpCon = (HttpURLConnection) serverUrl.openConnection();
httpCon.setDoOutput(true);
httpCon.setUseCaches(false);
httpCon.setFixedLengthStreamingMode(bytes.length);
httpCon.setRequestProperty("Authorization", tokenType + " "+ accessToken);
httpCon.setRequestMethod("POST");
httpCon.setRequestProperty("Content-Type", "application/json");
printout = new DataOutputStream(httpCon.getOutputStream());
printout.writeBytes(json);
printout.flush();
printout.close();
...
}
Voici une solution avec les modifications suivantes:
Essayez-le:
// String json;
URL serverUrl = null;
try {
serverUrl = new URL(Config.APP_SERVER_URL + URL);
} catch (MalformedURLException e) {
...
}
try {
byte[] bytes = json.getBytes("UTF-8");
httpCon = (HttpURLConnection) serverUrl.openConnection();
httpCon.setDoOutput(true);
httpCon.setUseCaches(false);
httpCon.setFixedLengthStreamingMode(bytes.length);
httpCon.setRequestProperty("Authorization", tokenType + " "+ accessToken);
httpCon.setRequestMethod("POST");
httpCon.setRequestProperty("Content-Type", "application/json; charset=UTF-8");
OutputStream os = httpCon.getOutputStream();
os.write(bytes);
os.close();
...
}
De la documentation Oracle ici . Nous savons que la méthode de vidage de DataOutputStream appelle la méthode de vidage du flux de sortie sous-jacent. Si vous regardez la classe URLConnection dans ici cela indique que chaque sous-classe de URLConnection doit avoir cette méthode remplacée. Si vous voyez la HttpUrlConnection ici nous voyons que la méthode de vidage n'est pas remplacée. Cela pourrait être l'une des raisons de votre problème.