2011-12-21 43 views
60

Hay setDoOutput() en URLConnection. De acuerdo con documentation Debería¿A qué afecta exactamente URLConnection.setDoOutput()?

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

Ahora estoy frente a exactly this problem - el tiempo de ejecución de Java convierte la solicitud a POST vez setDoOutput(true) se llama y el servidor sólo responde a las peticiones GET. Quiero entender qué sucede si elimino ese 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 GET solicitudes? ¿Qué es "salida" en el contexto de este método?

Respuesta

76

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

El envío del cuerpo de la petición en sí se lleva a cabo a través del flujo de salida de la conexión:

conn.getOutputStream().write(someBytes); 
+0

¿Qué sucede si estoy descargando una imagen? – Jaydev

+0

Descargando? ¿O subiendo? – Thilo

24

setDoOutput(true) se utiliza para POST y PUT solicitudes. Si es false, entonces es para usar las solicitudes GET.

+0

Quizás también para PUT. – Thilo

+0

@Thilo - Buen punto. –

+1

bien, ¿cómo puedo forzar esta conexión para hacer PUT ya que el servidor del otro lado solo acepta solicitudes PUT, no POST ...? –

0
public void setDoOutput(boolean dooutput) 

Se necesita un valor que el parámetro y establece este valor del campo doOutput para este URLConnection en el valor especificado.

Se puede usar 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 el resultado, falso si no. El valor predeterminado es falso.

+3

Lo he leído en la documentación antes de preguntar. La razón por la que estoy preguntando es que no entiendo las implicaciones de eso. – sharptooth

+0

Si desea escribir en un objeto de conexión, debe configurar el serDoOutput verdadero –

1

Adición de un comentario, si usted tiene una conexión de larga duración y le enviará tanto 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