Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


¿Cómo desactivo explícitamente el modo de flujo en bloque para las conexiones HTTP en Android?

Estoy apuntando a un servicio web REST desde Android 4.0 usando HttpsURLConnection . Esto funciona bien a menos que intente POST algo. Esta es la sección de código relevante:

  connection.setDoOutput(true); connection.setChunkedStreamingMode(0); ByteArrayOutputStream out = new ByteArrayOutputStream(); serializeObjectToStream(out, object); byte[] array = out.toByteArray(); connection.getOutputStream().write(array, 0, array.length); 

Esto arroja la excepción siguiente:

  • Cómo enviar un POST "multipart / form-data" en Android con Volley
  • Cómo establecer setLayoutParams para elementos de diseño lineales
  • ¿Cómo puedo cambiar programáticamente el destino ImageButton src cuando se cumple una condición?
  • Vista de lista expandible mover icono de grupo icono a la derecha
  • Branch.io deeplink en android abre Play Store incluso sin importar qué
  • Efecto de sombra para un texto en Android?
  •   java.net.HttpRetryException: Cannot retry streamed HTTP body 

    Desde la depuración me di cuenta de que la salida de flujo que obtengo a través de connection.getOuputStream() es de tipo ChunkedOutputStream y de cavar en el código fuente de Androids me imaginé que si una solicitud tiene que ser juzgado (por cualquier razón), empuja con la excepción anterior, Porque se da cuenta de que no está utilizando un RetryableOutputStream que quiere allí.

    La pregunta es ahora: ¿Cómo hago que mi HttpsURLConnection devuelva tal RetryableOutputStream, o mejor dicho, cómo puedo prevenir la codificación de la solicitud en trozos correctamente? Pensé que ya lo setChunkedStreamingMode(0) con setChunkedStreamingMode(0) , pero al parecer este no es el caso …

    [editar]

    No, la implementación de java.net.HTTPUrlConnection ignora un modo de streaming de 0 o inferior:

      public void setChunkedStreamingMode(int chunkLength) { [...] if (chunkLength <= 0) { this.chunkLength = HttpEngine.DEFAULT_CHUNK_LENGTH; } else { this.chunkLength = chunkLength; } } 

  • Uso de MatrixCursor y SimpleCursorAdapter en un ListView con texto e imágenes
  • Proteger la aplicación Android de la piratería
  • ¿Cómo insertar elementos adicionales en un SimpleCursorAdapter o Cursor para un Spinner?
  • No se puede importar las clases import android.hardware.camera2
  • Android - java.lang.SecurityException: Permiso Negación: Intención inicial
  • Cómo silenciar MediaPlayer en android
  • 2 Solutions collect form web for “¿Cómo desactivo explícitamente el modo de flujo en bloque para las conexiones HTTP en Android?”

    ¡Gorrón! La solución es no llamar a setChunkedStreamingMode() (o incluso setFixedStreamingMode() ) del código del cliente en absoluto! "-1" son los valores internos por defecto de fixedLength y chunkedLength y no se pueden establecer en el lado del cliente, ya que si se establece un valor inferior o igual a "0", se HttpEngine.DEFAULT_CHUNK_LENGTH (o se HttpEngine.DEFAULT_CHUNK_LENGTH una excepción en el modo de flujo fijo ).

    La solución es establecer un encabezado Content-Length (que puede ser establecido por esta parte siguiente) y llamar a setFixedLengthStreamingMode con la longitud apropiada del mensaje POST que desea enviar.

    Vea la sección "streaming mode" en este SO FAQ:

    Uso de java.net.URLConnection para disparar y gestionar solicitudes HTTP

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.