2008-09-02 5 views

Antwort

16

Wenn Sie das Objekt URLConnection mithilfe von openConnection() abrufen, wird die Kommunikation mit dem Server nicht gestartet. Das passiert erst, wenn Sie den Stream von URLConnection() bekommen. Wenn Sie die Verbindung zum ersten Mal erhalten, können Sie Header und andere Verbindungseigenschaften hinzufügen/ändern, bevor Sie sie tatsächlich öffnen.

Der Lebenszyklus von URLConnection ist ein bisschen seltsam. Es sendet die Header nicht an den Server, bis Sie einen der Streams erhalten haben. Wenn Sie nur den Input-Stream bekommen, dann glaube ich, dass es ein GET, sendet die Header, dann können Sie die Ausgabe lesen. Wenn Sie den Ausgabestream erhalten, glaube ich, dass es als POST gesendet wird, da davon ausgegangen wird, dass Sie Daten darauf schreiben werden (Sie müssen möglicherweise setDoOutput(true) aufrufen, damit der Ausgabestream funktioniert). Sobald Sie den Eingabestream erhalten, wird der Ausgabestream geschlossen und auf die Antwort vom Server gewartet.

Zum Beispiel soll dies eine POST tun:

URL myURL = new URL("http://example.com/my/path"); 
URLConnection conn = myURL.openConnection(); 
conn.setDoOutput(true); 
conn.setDoInput(true); 

OutputStream os = conn.getOutputStream(); 
os.write("Hi there!"); 
os.close(); 

InputStream is = conn.getInputStream(); 
// read stuff here 

Während dies eine GET tun würde:

URL myURL = new URL("http://example.com/my/path"); 
URLConnection conn = myURL.openConnection(); 
conn.setDoOutput(false); 
conn.setDoInput(true); 

InputStream is = conn.getInputStream(); 
// read stuff here 

URLConnection auch tun andere seltsame Dinge. Wenn der Server eine Inhaltslänge angibt, behält URLConnection den zugrunde liegenden Eingabestream so lange offen, bis er so viele Daten empfängt, auch wenn Sie ihn explizit schließen(). Das hat uns viele Probleme bereitet, da es unseren Client ein wenig hart heruntergefahren hat, da die URLConnection die Netzwerkverbindung offen halten würde. Dies ist wahrscheinlich wahrscheinlich, auch wenn Sie nur getStream() verwenden.

3

Nein, tut es nicht. Aber wenn das Protokoll der URL HTTP ist, erhalten Sie eine HttpURLConnection als Rückgabeobjekt. Diese Klasse verfügt über eine setRequestMethod-Methode, um anzugeben, welche HTTP-Methode Sie verwenden möchten.

Wenn Sie anspruchsvollere Sachen machen möchten, sind Sie wahrscheinlich besser dran mit einer Bibliothek wie Jakarta HttpClient.