Was genau wirkt sich URLConnection.setDoOutput () aus?


80

Es gibt setDoOutput()in URLConnection. Laut Dokumentation sollte ich

Setzen Sie das DoOutput-Flag auf true, wenn Sie die URL-Verbindung für die Ausgabe verwenden möchten, andernfalls auf false.

Jetzt stehe ich genau vor diesem Problem : Die Java-Laufzeit konvertiert die Anforderung so, dass sie POSTeinmal setDoOutput(true)aufgerufen wird und der Server nur auf GETAnforderungen reagiert . Ich möchte verstehen, was passiert, wenn ich das setDoOutput(true)aus dem Code entferne .

Was genau wird dies beeinflussen? Angenommen, ich stelle es auf false- was kann ich jetzt tun und was kann ich jetzt nicht tun? Kann ich GETAnfragen ausführen ? Was ist "Ausgabe" im Kontext dieser Methode?

Antworten:


96

Sie müssen es auf true setzen, wenn Sie einen Anforderungshauptteil senden ( ausgeben ) möchten , z. B. mit POST- oder PUT-Anforderungen. Mit GET senden Sie normalerweise keinen Körper, sodass Sie ihn nicht benötigen.

Das Senden des Anforderungshauptteils selbst erfolgt über den Ausgabestream der Verbindung:

conn.getOutputStream().write(someBytes);

Was ist, wenn ich ein Bild herunterlade?
Jaydev

Wird heruntergeladen? Oder hochladen?
Thilo

27

setDoOutput(true)wird für POSTund PUTAnfragen verwendet. Wenn dies der falseFall ist, werden GETAnforderungen verwendet.


2
ok, wie kann ich dann diese Verbindung zum PUT zwingen, da der Server auf der anderen Seite nur PUT-Anfragen akzeptiert, nicht POST ...?
ante.sabo

Was ist, wenn ich ein Bild herunterlade?
Jaydev

1

Wenn Sie einen Kommentar hinzufügen, wenn Sie eine langjährige Verbindung haben und sowohl GETs als auch POSTs senden, mache ich Folgendes:

if (doGet) {    // some boolean
    con.setDoOutput(false); // reset any previous setting, if con is long lasting
    con.setRequestMethod("GET");
}
else {
    con.setDoOutput(true);  // reset any previous setting, if con is long lasting
    con.setRequestMethod("POST");
}

Schließen Sie die Verbindung jedes Mal, um eine dauerhafte Verbindung zu vermeiden.

if (doClose)    // some boolean
    con.setRequestProperty("Connection", "close");

con.connect();              // force connect request

0
public void setDoOutput( boolean dooutput )

Es nimmt einen Wert als Parameter und setzt diesen Wert von doOutput Feldes für diese URLConnection auf den angegebenen Wert.

Eine URL-Verbindung kann zur Eingabe und / oder Ausgabe verwendet werden. Setzen Sie das DoOutput-Flag auf true, wenn Sie die URL-Verbindung für die Ausgabe verwenden möchten, andernfalls auf false. Der Standardwert ist false.


3
Ich habe das in der Dokumentation gelesen, bevor ich gefragt habe. Der Grund, den ich frage, ist, dass ich die Implikationen davon nicht verstehe.
Scharfzahn

Wenn Sie in ein Verbindungsobjekt schreiben möchten, müssen Sie den serDoOutput auf true setzen
Mithun Sasidharan
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.