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:

  • Haga que EditText crezca a medida que se llena
  • ¿Cómo hacer que Proguard ignore las bibliotecas externas?
  • Viewpager desborda la pantalla dentro del diseño del coordinador
  • Cómo formatear una actividad de otra actividad mediante opciones de menú
  • Problema de devolución de llamada de diálogo a pantalla completa de Android
  • KeyStore getEntry devuelve null después de cambiar la contraseña
  •   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; } } 

  • Proveedor de calendario de Android: ¿Existe un identificador único para eventos, utilizable en varios dispositivos?
  • Android - FirebaseApp / Firebase-Inicialización no se inicia
  • Valor predeterminado para Gradle buildConfigField booleano utilizado en todos los sabores
  • Agregar botón a un diseño mediante programación
  • Personalización de la barra de desplazamiento vertical de Android ScrollView
  • Cómo crear una actividad de configuración para Android Live Wallpaper
  • 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.