studio example java android httpurlconnection

java - example - Se ignora el rango de configuración HttpUrlConnection en Android



httpurlconnection send post android (4)

¿Has probado así?

urlConnection.setRequestProperty("Range", "bytes=1000-");

Estoy tratando de obtener una respuesta 206 de mi servidor usando Android.

Aquí está el código.

@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_splash); new AsyncTask<Void, Void, Void>() { @Override protected Void doInBackground(Void... params) { try { URL url = new URL("http://aviddapp.com/10mb.file"); HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); urlConnection.setRequestProperty("Range", "bytes=1-2"); urlConnection.connect(); System.out.println("Response Code: " + urlConnection.getResponseCode()); System.out.println("Content-Length: " + urlConnection.getContentLength()); Map<String, List<String>> map = urlConnection.getHeaderFields(); for (Map.Entry<String, List<String>> entry : map.entrySet()) { System.out.println("Key : " + entry.getKey() + " ,Value : " + entry.getValue()); } InputStream inputStream = urlConnection.getInputStream(); long size = 0; while(inputStream.read() != -1 ) size++; System.out.println("Downloaded Size: " + size); }catch(MalformedURLException mue) { mue.printStackTrace(); }catch(IOException ioe) { ioe.printStackTrace(); } return null; } }.execute(); }

Aquí está la salida:

I/System.out: Respnse Code: 200 I/System.out: Content-Length: -1 I/System.out: Key : null ,Value : [HTTP/1.1 200 OK] I/System.out: Key : Accept-Ranges ,Value : [bytes] I/System.out: Key : Cache-Control ,Value : [max-age=604800, public] I/System.out: Key : Connection ,Value : [Keep-Alive] I/System.out: Key : Date ,Value : [Tue, 04 Oct 2016 07:45:22 GMT] I/System.out: Key : ETag ,Value : ["a00000-53e051f279680-gzip"] I/System.out: Key : Expires ,Value : [Tue, 11 Oct 2016 07:45:22 GMT] I/System.out: Key : Keep-Alive ,Value : [timeout=5, max=100] I/System.out: Key : Last-Modified ,Value : [Tue, 04 Oct 2016 07:36:42 GMT] I/System.out: Key : Server ,Value : [Apache/2.4.12 (Unix) OpenSSL/1.0.1e-fips mod_bwlimited/1.4] I/System.out: Key : Transfer-Encoding ,Value : [chunked] I/System.out: Key : Vary ,Value : [Accept-Encoding,User-Agent] I/System.out: Key : X-Android-Received-Millis ,Value : [1475567127403] I/System.out: Key : X-Android-Response-Source ,Value : [NETWORK 200] I/System.out: Key : X-Android-Sent-Millis ,Value : [1475567127183] I/System.out: Downloaded Size: 10485760

Ahora estoy haciendo lo mismo es java puro.

public static void main(String... args) { try { URL url = new URL("http://aviddapp.com/10mb.file"); HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); urlConnection.setRequestProperty("Range", "bytes=1-2"); urlConnection.connect(); System.out.println("Respnse Code: " + urlConnection.getResponseCode()); System.out.println("Content-Length: " + urlConnection.getContentLength()); Map<String, List<String>> map = urlConnection.getHeaderFields(); for (Map.Entry<String, List<String>> entry : map.entrySet()) { System.out.println("Key : " + entry.getKey() + " ,Value : " + entry.getValue()); } InputStream inputStream = urlConnection.getInputStream(); long size = 0; while(inputStream.read() != -1 ) size++; System.out.println("Downloaded Size: " + size); }catch(MalformedURLException mue) { mue.printStackTrace(); }catch(IOException ioe) { ioe.printStackTrace(); } }

Aquí está la salida

Respnse Code: 206 Content-Length: 2 Key : Keep-Alive ,Value : [timeout=5, max=100] Key : null ,Value : [HTTP/1.1 206 Partial Content] Key : Server ,Value : [Apache/2.4.12 (Unix) OpenSSL/1.0.1e-fips mod_bwlimited/1.4] Key : Content-Range ,Value : [bytes 1-2/10485760] Key : Connection ,Value : [Keep-Alive] Key : Last-Modified ,Value : [Tue, 04 Oct 2016 07:36:42 GMT] Key : Date ,Value : [Tue, 04 Oct 2016 07:42:17 GMT] Key : Accept-Ranges ,Value : [bytes] Key : Cache-Control ,Value : [max-age=604800, public] Key : ETag ,Value : ["a00000-53e051f279680"] Key : Vary ,Value : [Accept-Encoding,User-Agent] Key : Expires ,Value : [Tue, 11 Oct 2016 07:42:17 GMT] Key : Content-Length ,Value : [2] Downloaded Size: 2

Como puede ver, estoy obteniendo diferentes códigos de respuesta en ambos casos. Parece que Android no está pasando el Range al servidor tal vez? ¿Que esta pasando aqui?

PD: obtengo un 206 si el tamaño del archivo es de 1 mb.


Estoy relativamente seguro de que el error no está en el código de Android.

Parece que el servidor podría estar dando resultados espurios.

Puede consultar con una herramienta de terceros (como Postman) para determinar los encabezados que ofrece el servicio web.

Mis resultados utilizando Postman. Como puede ver, está entregando HTTP 200 (no 206 ). Tampoco se trata de una Content-Length limitada. Si el servidor es suyo, quizás compruebe que esté configurado correctamente. También revise su código con otros servidores.


Hola, ¿Puedes probar este fragmento de código? Parece que estoy obteniendo HTTP 206 aquí.

new Thread() { @Override public void run() { try { URL url = new URL("http://aviddapp.com/10mb.file"); HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); // urlConnection.setRequestMethod("HEAD"); urlConnection.setRequestProperty("Accept-Encoding", ""); urlConnection.setRequestProperty("Range", "bytes=1-2"); urlConnection.connect(); System.out.println("Response Code: " + urlConnection.getResponseCode()); System.out.println("Content-Length: " + urlConnection.getContentLength()); Map<String, List<String>> map = urlConnection.getHeaderFields(); for (Map.Entry<String, List<String>> entry : map.entrySet()) { System.out.println("Key : " + entry.getKey() + " ,Value : " + entry.getValue()); } InputStream inputStream = urlConnection.getInputStream(); long size = 0; while (inputStream.read() != -1) size++; System.out.println("Downloaded Size: " + size); } catch (IOException ioe) { ioe.printStackTrace(); } } }.start();

Solo tienes que añadir esto en tarea asíncrona.

Compruebe este resultado comentando en / fuera de esta línea.

urlConnection.setRequestProperty("Accept-Encoding", "");


No estoy seguro de que esto esté relacionado con Content-Length está siendo borrada por la implementación de Android de forma predeterminada. Mire el siguiente fragmento de código desde el código fuente donde dice que hace compresión gzip de forma predeterminada.

https://android.googlesource.com/platform/libcore/+/2e317a02b5a8f9b319488ab9311521e8b4f87a0a/luni/src/main/java/java/net/HttpURLConnection.java

De forma predeterminada, esta implementación de HttpURLConnection solicita que los servidores utilicen la compresión gzip y descomprime automáticamente los datos para los llamadores de getInputStream() . Las cabeceras de respuesta Content-Encoding y Content-Length se borran en este caso.

¿Puedes intentar deshabilitar el almacenamiento en caché predeterminado usando el siguiente código para verificar si funciona?

urlConnection.setRequestProperty("Accept-Encoding", "identity");

PD: Perdón por los formateados malos. Usando la versión móvil de SO.