2016-03-30 11 views
3
geschrieben

ich eine Dispatcher-Anwendung entwickelt, und wenn ich Tests bekomme ich die Ausnahme IOException: nicht genügend Daten geschrieben das ist der Teil des Codes, der den Fehler Würfe:HttpURLConnection wirft java.io.IOException: nicht genügend Daten

final int responseCode = connection.getResponseCode(); 

final HttpURLConnection connection = (HttpURLConnection) new URL(getUrl()).openConnection(); 
final int timeout =200; 
final HttpRequestContext data = getData();//data contains the data send in the request to dispatche 
connection.setConnectTimeout(timeout); 
for (final Entry<String, List<String>> entry : data.getHeaders().entrySet()) { 
    for (final String value : entry.getValue()) { 
    connection.setRequestProperty(entry.getKey(), value); 
    } 
} 
connection.setUseCaches(false); 
connection.setDoInput(true); 
connection.setDoOutput(true); 
if (data.getContentLength() > 0) { 
    connection.setFixedLengthStreamingMode(data.getContentLength()); 
} 
connection.setReadTimeout(timeout); 
connection.setRequestMethod(data.getMethod()); 
final int responseCode = connection.getResponseCode(); 
if (responseCode == HttpURLConnection.HTTP_OK) { 
    final HttpRequestContext data = getData(); 

if (ArrayUtils.isEmpty(data.getBody())) { 
    LOGGER.debug("No data to send"); 
} else { 
    IOUtils.write(data.getBody(), connection.getOutputStream()); 
} 
} 

Log:

java.io.IOException: insufficient data written 
at sun.net.www.protocol.http.HttpURLConnection$StreamingOutputStream.close(HttpURLConnection.java:3501) 
at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1470) 
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1441) 
at java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:480) 
at com.dhl.dispatcher.HttpRequestWriter.doRun(HttpRequestWriter.java:78) 
at com.dhl.dispatcher.AbstractRequestWriter.run(AbstractRequestWriter.java:73) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
at java.lang.Thread.run(Thread.java:745) 

dank für Ihre Hilfe.

+0

posten Sie bitte das vollständige Protokoll! –

+0

Warum setzen Sie die Inhaltslänge auf die Länge des Anfragetexts? Und warum stellst du es ein, aber schickst du nichts zurück? – EJP

+0

Ich aktualisierte die Antwort – djodjo

Antwort

0

Sie nie irgendwelche Daten senden, aber Sie setzen

connection.setFixedLengthStreamingMode(data.getContentLength()); 

Sie smth wie dies zu tun ist, bevor u die Antwort erhalten:

 DataOutputStream out = new DataOutputStream(connection.getOutputStream()); 
     out.write(body); 
     out.close(); 

UPDATE: tun

final int responseCode = connection.getResponseCode();

ma kes die Anfrage

müssen Sie den Körper vorher hinzufügen. Dies ist der Teil des Codes

if (data.getContentLength() > 0) { 
    connection.setFixedLengthStreamingMode(data.getContentLength()); 
} 

, die die insufficient data written Ausnahme verursacht:

+0

Ich aktualisiere den Code, um das Loch zu verstehen mecanisme – Sabrin

+0

Danke Ihnen. Ich löse das Problem, indem ich den Körper vor connection.getResponseCode(); – Sabrin

+0

willkommen! BTW, wenn Sie gerade anfangen, Ihren Android-Client zu schreiben, empfehle ich Ihnen, https://github.com/appt/jus zu versuchen, das basiert auf Volley, aber ziemlich weiter entwickelt und einfacher :) – djodjo

0

Der folgende Code kann gelöscht werden, wenn es nicht verwendet wird.

Verwandte Themen