24 - Biblioteca Volley - Recuperar un página HTML

La biblioteca Volley nos facilita y agiliza el acceso a Internet para procesar:

- Array JSON (JsonArrayRequest)
- Objeto JSON (JsonObjectRequest)

Ahora veremos que disponemos de otra clase que nos permite recuperar un archivo en formato String: (StringRequest)

Problema

Ingresar una URL de un sitio web y recuperar el archivo HTML de dicha dirección, mostrar su contenido en formato HTML.

Crearemos el proyecto 'Compose26'

Agregamos las dependencias de la biblioteca Volley:

dependencies {
        ...
        implementation 'com.android.volley:volley:1.2.0'
    }

Nuestra aplicación debe acceder a internet por lo que debemos pedir dicho permiso:

<uses-permission android:name="android.permission.INTERNET"/>

La interfaz visual a implementar debe ser similar a:

biblioteca Volley Jetpack Compose

El código a implementar en Kotlin para obtener dicha funcionalidad es:

package com.tutorialesprogramacionya.compose26

import android.content.Context
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.material.*
import androidx.compose.runtime.*
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import androidx.compose.foundation.background
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll
import androidx.compose.ui.Alignment
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.unit.sp
import com.android.volley.Request
import com.android.volley.toolbox.StringRequest
import com.android.volley.toolbox.Volley

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            PantallaPrincipal()
        }
    }
}

@Composable
fun PantallaPrincipal() {
    val contexto = LocalContext.current
    var url by remember { mutableStateOf("https://www.google.com.ar") }
    var pagina by remember { mutableStateOf("") }
    val scroll = rememberScrollState(0)
    Column(
        modifier = Modifier.fillMaxSize(),
        horizontalAlignment = Alignment.CenterHorizontally
    ) {
        OutlinedTextField(
            value = url,
            onValueChange = { url = it },
            label = {
                Text(text = "Url del sitio")
            },
            modifier = Modifier
                .fillMaxWidth()
                .padding(5.dp)
        )
        Button(onClick = {
            RecuperarPagina(contexto, url, {
                pagina = it
            })
        }) {
            Text(text = "Recuperar",modifier=Modifier.padding(5.dp))
        }
        Text(
            text = "$pagina",
            fontSize = 15.sp,
            modifier = Modifier
                .verticalScroll(scroll)
                .fillMaxWidth()
                .background(Color(0xFFeeeee4))
                .weight(1f)
        )
    }
}

fun RecuperarPagina(contexto: Context, url: String, datosRecuperados: (String) -> Unit) {
    val queue = Volley.newRequestQueue(contexto)
    val requerimiento = StringRequest(
        Request.Method.GET,
        url,
        { response ->
            datosRecuperados(response.toString())
        }
    ) { error -> }

    queue.add(requerimiento)
}

Cuando se presiona el botón 'Recuperar' llamamos a la función RecuperarPagina y le pasamos la url del sitio que queremos rescatar su HTML:

        Button(onClick = {
            RecuperarPagina(contexto, url, {
                pagina = it
            })
        }) {
            Text(text = "Recuperar",modifier=Modifier.padding(5.dp))
        }

La función RecuperarPagina crea un objeto de la clase StringRequest, el servidor nos retorna el contenido de la página como texto y procedemos a llamar la la función datosRecuperados para que actualice el estado y se visualicen los datos:

fun RecuperarPagina(contexto: Context, url: String, datosRecuperados: (String) -> Unit) {
    val queue = Volley.newRequestQueue(contexto)
    val requerimiento = StringRequest(
        Request.Method.GET,
        url,
        { response ->
            datosRecuperados(response.toString())
        }
    ) { error -> }

    queue.add(requerimiento)
}

Probar luego ingresando la url siguiente:

https://scratchya.com.ar/videosandroidjava/volley/listararticulos.php

Se debería mostrar en modo texto el archivo Json:

biblioteca Volley Jetpack Compose

Este proyecto lo puede descargar en un zip desde este enlace: Compose26.zip