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.