Search code examples
javaandroidhttpurlconnectiondataoutputstream

DataOutputSteam is throwing me a 'java.io.IOException: unexpected end of stream'?


I'm trying to make a Request to a WebService from an android application, using HttpUrlConnection. But sometimes it works, and sometimes it does not.

When I try sending this value:

JSON value

 {"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"}

I got an "unexpected end of stream" Exception in the DataOutputStream close function.

Here is my 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();
    ...
}

Solution

  • Here's a solution with the following changes:

    • It gets rid of the DataOutputStream, which is certainly the wrong thing to use.
    • It correctly sets and delivers the content length.
    • It doesn't depend on any defaults regarding the encoding, but explicitly sets UTF-8 in two places.

    Try it:

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