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?

scharfer Zahn
quelle

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);
Thilo
quelle
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.

Petar Minchev
quelle
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
SoloPilot
quelle
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.

Mithun Sasidharan
quelle
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