Próbuję napisać na numer URLConnection#getOutputStream
, jednak żadne dane nie zostaną wysłane, dopóki nie zadzwonię pod numer URLConnection#getInputStream
. Nawet jeśli ustawię URLConnnection#doInput
na false, nadal nie będzie wysyłane. Czy ktoś wie, dlaczego tak jest? W dokumentacji API, która to opisuje, nie ma nic.Dlaczego trzeba wywołać metodę URLConnection # getInputStream, aby móc pisać na adres URLConnection # getOutputStream?
Java API Dokumentacja URLConnection: http://download.oracle.com/javase/6/docs/api/java/net/URLConnection.html
Java Tutorial na odczyt i zapis do URLConnection: http://download.oracle.com/javase/tutorial/networking/urls/readingWriting.html
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.net.URL;
import java.net.URLConnection;
public class UrlConnectionTest {
private static final String TEST_URL = "http://localhost:3000/test/hitme";
public static void main(String[] args) throws IOException {
URLConnection urlCon = null;
URL url = null;
OutputStreamWriter osw = null;
try {
url = new URL(TEST_URL);
urlCon = url.openConnection();
urlCon.setDoOutput(true);
urlCon.setRequestProperty("Content-Type", "text/plain");
////////////////////////////////////////
// SETTING THIS TO FALSE DOES NOTHING //
////////////////////////////////////////
// urlCon.setDoInput(false);
osw = new OutputStreamWriter(urlCon.getOutputStream());
osw.write("HELLO WORLD");
osw.flush();
/////////////////////////////////////////////////
// MUST CALL THIS OTHERWISE WILL NOT WRITE OUT //
/////////////////////////////////////////////////
urlCon.getInputStream();
/////////////////////////////////////////////////////////////////////////////////////////////////////////
// If getInputStream is called while doInput=false, the following exception is thrown: //
// java.net.ProtocolException: Cannot read from URLConnection if doInput=false (call setDoInput(true)) //
/////////////////////////////////////////////////////////////////////////////////////////////////////////
} catch (Exception e) {
e.printStackTrace();
} finally {
if (osw != null) {
osw.close();
}
}
}
}
Dobre znalezisko na błąd! To naprawdę oczyszcza sprawy i cieszę się, że wiem, że zostało to gdzieś udokumentowane. Dzięki! – John
Java 8 nadal ma ten błąd/nieudokumentowaną funkcję, jak właśnie odkryłem. (Znalazłem tę stronę, szukając rozwiązania lub obejścia tego problemu.) Czy jest teraz lepsza alternatywa, ponad sześć lat po zadaniu pierwotnego pytania? –