Frage

Wenn ich ein HTTP erstelle java.net.URL und dann anrufen openConnection() Bedeutet das unbedingt, dass ein HTTP-Beitrag stattfinden wird?ich weiß, dass openStream() impliziert ein GET.Wenn ja, wie führen Sie eines der anderen HTTP-Verben aus, ohne mit der Raw-Socket-Schicht arbeiten zu müssen?

War es hilfreich?

Lösung

Wenn Sie die abrufen URLConnection Objekt verwenden openConnection() Es beginnt nicht wirklich mit dem Server zu kommunizieren.Das passiert erst, wenn Sie den Stream von erhalten URLConnection().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 etwas seltsam.Die Header werden erst dann an den Server gesendet, wenn Sie einen der Streams erhalten haben.Wenn Sie nur den Eingabestream erhalten, wird meiner Meinung nach ein GET ausgeführt, die Header gesendet und Sie können dann die Ausgabe lesen.Wenn Sie den Ausgabestream erhalten, wird er meiner Meinung nach als POST gesendet, da davon ausgegangen wird, dass Sie Daten darauf schreiben (möglicherweise müssen Sie anrufen setDoOutput(true) damit der Ausgabestream funktioniert).Sobald Sie den Eingabestream erhalten, wird der Ausgabestream geschlossen und wartet auf die Antwort vom Server.

Dies sollte beispielsweise ein POST sein:

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 ein GET ausführen 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 wird auch andere seltsame Dinge tun.Wenn der Server eine Inhaltslänge angibt, dann URLConnection hält den zugrunde liegenden Eingabestream offen, bis er so viele Daten empfängt, auch wenn Sie es explizit schließen.Dies bereitete uns viele Probleme, da es etwas schwierig war, unseren Client sauber herunterzufahren URLConnection würde die Netzwerkverbindung offen halten.Dies ist wahrscheinlich auch dann vorhanden, wenn Sie es nur verwenden getStream() obwohl.

Andere Tipps

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

Wenn Sie anspruchsvollere Dinge tun möchten, ist die Verwendung einer Bibliothek wie z. B. wahrscheinlich besser Jakarta HttpClient.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top