¿A qué afecta exactamente URLConnection.setDoOutput ()?

80

Hay setDoOutput()en URLConnection. Según la documentación debería

Establezca el indicador DoOutput en verdadero si tiene la intención de utilizar la conexión URL para la salida, falso en caso contrario.

Ahora me enfrento exactamente a este problema : el tiempo de ejecución de Java convierte la solicitud a POSTuna vez que setDoOutput(true)se llama y el servidor solo responde a las GETsolicitudes. Quiero entender qué sucede si elimino eso setDoOutput(true)del código.

¿Qué afectará esto exactamente? Supongamos que lo configuro en false: ¿qué puedo hacer ahora y qué no puedo hacer ahora? ¿Podré realizar GETsolicitudes? ¿Qué es "salida" en el contexto de este método?

diente filoso
fuente

Respuestas:

96

Debe establecerlo en verdadero si desea enviar ( generar ) un cuerpo de solicitud, por ejemplo, con solicitudes POST o PUT. Con GET, no suele enviar un cuerpo, por lo que no lo necesita.

El envío del cuerpo de la solicitud se realiza a través del flujo de salida de la conexión:

conn.getOutputStream().write(someBytes);
Thilo
fuente
¿Qué pasa si estoy descargando una imagen?
Jaydev
Descargando? ¿O subiendo?
Thilo
27

setDoOutput(true)se utiliza para POSTy PUTsolicita. Si es falseasí, es para usar GETsolicitudes.

Petar Minchev
fuente
2
ok, ¿cómo puedo forzar esta conexión para hacer PUT ya que el servidor del otro lado solo acepta solicitudes PUT, no POST ...?
ante.sabo
¿Qué pasa si estoy descargando una imagen?
Jaydev
1

Agregando un comentario, si tiene una conexión duradera y envía GET y POST, esto es lo que hago:

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");
}

Y para evitar que la conexión sea duradera, ciérrela cada vez.

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

con.connect();              // force connect request
SoloPilot
fuente
0
public void setDoOutput( boolean dooutput )

Toma un valor como parámetro y establece este valor del doOutputcampo para esta URLConnection en el valor especificado.

Se puede utilizar una conexión URL para entrada y / o salida. Establezca el indicador DoOutput en verdadero si tiene la intención de utilizar la conexión URL para la salida, falso en caso contrario. El valor predeterminado es falso.

Mithun Sasidharan
fuente
3
Lo he leído en la documentación antes de preguntar. La razón por la que pregunto es que no entiendo las implicaciones de eso.
diente afilado
Si desea escribir en un objeto de conexión, debe establecer serDoOutput como verdadero
Mithun Sasidharan