Ich benutze HttpURLConnection, um HTTP-POST zu tun, aber ich bekomme nicht immer die volle Antwort zurück. Ich wollte das Problem beheben, aber wenn ich durch jede Zeile gehe, funktionierte es. Ich dachte, es muss ein Timing-Problem sein, also habe ich Thread.sleep hinzugefügt und es hat wirklich meinen Code funktioniert, aber das ist nur eine vorübergehende Lösung. Ich frage mich, warum das passiert und wie man es löst. Hier ist mein Code:HttpURLConnection liest nicht die ganze Antwort
public static InputStream doPOST(String input, String inputMimeType, String url, Map<String, String> httpHeaders, String expectedMimeType) throws MalformedURLException, IOException {
URL u = new URL(url);
URLConnection c = u.openConnection();
InputStream in = null;
String mediaType = null;
if (c instanceof HttpURLConnection) {
//c.setConnectTimeout(1000000);
//c.setReadTimeout(1000000);
HttpURLConnection h = (HttpURLConnection)c;
h.setRequestMethod("POST");
//h.setChunkedStreamingMode(-1);
setAccept(h, expectedMimeType);
h.setRequestProperty("Content-Type", inputMimeType);
for(String key: httpHeaders.keySet()) {
h.setRequestProperty(key, httpHeaders.get(key));
if (logger.isDebugEnabled()) {
logger.debug("Request property key : " + key + "/value : " + httpHeaders.get(key));
}
}
h.setDoOutput(true);
h.connect();
OutputStream out = h.getOutputStream();
out.write(input.getBytes());
out.close();
mediaType = h.getContentType();
logger.debug(" ------------------ sleep ------------------ START");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
logger.debug(" ------------------ sleep ------------------ END");
if (h.getResponseCode() < 400) {
in = h.getInputStream();
} else {
in = h.getErrorStream();
}
}
return in;
}
später ich die folgenden Eingabestrom
ByteArrayOutputStream bos = new ByteArrayOutputStream();
while (is.available() > 0) {
bos.write(is.read());
}
is.close();
//is.read(bytes);
if (logger.isDebugEnabled()) {
logger.debug(" Response lenght is : " + is.available());
//logger.debug("RAW response is " + new String(bytes));
logger.debug("RAW response is " + new String(bos.toByteArray()));
}
Es genearates den folgenden HTTP-Header
POST /emailauthentication/ HTTP/1.1
Accept: application/xml
Content-Type: application/xml
Authorization: OAuth oauth_consumer_key="b465472b-d872-42b9-030e-4e74b9b60e39",oauth_nonce="YnDb5eepuLm%2Fbs",oauth_signature="dbN%2FWeWs2G00mk%2BX6uIi3thJxlM%3D", oauth_signature_method="HMAC-SHA1", oauth_timestamp="1276524919", oauth_token="", oauth_version="1.0"
User-Agent: Java/1.6.0_20
Host: test:6580
Connection: keep-alive
Content-Length: 1107
In anderen Beiträgen zu lesen vorgeschlagen wurde zu drehen aus Keep-Alive mit dem
http.keepAlive=false
Systemeigenschaft, habe ich versucht, dass und die Header geändert
POST /emailauthentication/ HTTP/1.1
Accept: application/xml
Content-Type: application/xml
Authorization: OAuth oauth_consumer_key="b465472b-d872-42b9-030e-4e74b9b60e39", oauth_nonce="Eaiezrj6X4Ttt0", oauth_signature="ND9fAdZMqbYPR2j%2FXUCZmI90rSI%3D", oauth_signature_method="HMAC-SHA1", oauth_timestamp="1276526608", oauth_token="", oauth_version="1.0"
User-Agent: Java/1.6.0_20
Host: test:6580
Connection: close
Content-Length: 1107
die Verbindung Header „in der Nähe“, aber ich kann immer noch nicht die ganze Antwort lesen. Irgendeine Idee, was mache ich falsch?
Es gibt Zweideutigkeit in Ihrer Frage. * Von welcher * Antwort sprichst du? Mit diesem ganzen Code lesen Sie eigentlich keine Antwort, sondern erstellen eine Anfrage. Sie lesen seine Antwort mit 'h.getInputStream()' am unteren Rand, aber Sie ignorieren es und/oder zeigen nicht, wie Sie es verarbeiten. – BalusC
Hallo BalusC Ich habe die fehlenden Teile :) –