¿Cómo hacer una solicitud HTTP con Android?

En cualquier aplicación de Android, solo hay un límite que un usuario puede hacer sin una conexión a Internet. Todas las aplicaciones modernas de Android interactúan con los recursos disponibles en línea o con un backend específico para la aplicación. En este artículo, veremos una de las formas en que podemos recuperar y publicar recursos en línea a través de requests HTTP. Usaremos la Biblioteca Volley para manejar las requests HTTP.

Descripción general de la aplicación

Construiremos una aplicación simple en la que usaremos ImageView para mostrar imágenes de perros y un botón para obtener una imagen de otro perro. Cada vez que se presione el botón, se realizará una nueva solicitud HTTP para obtener una imagen de perro y se mostrará en ImageView.

Implementación paso a paso

Paso 1: crea un nuevo proyecto en Android Studio

Para crear un nuevo proyecto en Android Studio, consulte  Cómo crear/iniciar un nuevo proyecto en Android Studio . El código para eso se proporcionó tanto en Java como en el lenguaje de programación Kotlin para Android.

Paso 2: agregue las dependencias requeridas

Navegue a Gradle Scripts > build.gradle(Module:app) y agregue la siguiente dependencia en la sección de dependencias. 

1. Dependencia de la biblioteca Volley.

implementation 'com.android.volley:volley:1.2.1'

2. Biblioteca de procesamiento de imágenes Glide para almacenar en caché y cargar imágenes desde la URL de la imagen recuperada de la solicitud HTTP.

implementation 'com.github.bumptech.glide:glide:4.13.2'

Paso 3: agregar permisos de uso de Internet al archivo AndroidManifest.xml

Para permitir que nuestra aplicación haga llamadas de red, debemos decirle al sistema Android que nuestra aplicación requiere Internet para funcionar. Podemos hacer esto agregando el permiso de uso de Internet en el archivo de manifiesto de Android .

Vaya a aplicación > manifiestos > AndroidManifest.xml y agregue el código que se proporciona a continuación al archivo.

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

Paso 4: Trabajar con los archivos XML

Vaya a la aplicación > res > diseño > actividad_principal.xml y agregue el siguiente código a ese archivo. A continuación se muestra el código para el archivo  activity_main.xml .

XML

<?xml version="1.0" encoding="utf-8"?>
<!-- Root layout of our activity -->
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">
    <!--  This ImageView is used to show the dog images to the user  -->
    <ImageView
        android:id="@+id/dogImageView"
        android:layout_width="0dp"
        android:layout_height="0dp"
        app:layout_constraintBottom_toTopOf="@+id/nextDogButton"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        android:layout_marginHorizontal="6dp"
        android:layout_marginBottom="10dp"
        tools:srcCompat="@tools:sample/avatars" />
  
    <!--  This Button is used for making a new HTTP request for fetching new dog image  -->
    <Button
        android:id="@+id/nextDogButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Next Dog"
        android:padding="12dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        android:layout_marginBottom="30dp"/>
</androidx.constraintlayout.widget.ConstraintLayout>

Paso 5: trabajar con el archivo MainActivity

Vaya al archivo MainActivity y consulte el siguiente código. A continuación se muestra el código para el archivo MainActivity. Se agregan comentarios dentro del código para comprender el código con más detalle.

Kotlin

import android.os.Bundle
import android.util.Log
import android.widget.Button
import android.widget.ImageView
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import com.android.volley.Request
import com.android.volley.toolbox.JsonObjectRequest
import com.android.volley.toolbox.Volley
import com.bumptech.glide.Glide
  
class MainActivity : AppCompatActivity() {
  
    // member variable for holding the
    // ImageView in which images will 
    // be loaded
    private lateinit var mDogImageView: ImageView
    private lateinit var nextDogButton: Button
  
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
  
        // initialize the ImageView and the Button
        mDogImageView = findViewById(R.id.dogImageView)
        nextDogButton = findViewById(R.id.nextDogButton)
  
        // attaching on click listener to the button so 
        // that `loadDogImage()` function is called
        // everytime after clicking it.
        nextDogButton.setOnClickListener { loadDogImage() }
  
        // image of a dog will be loaded once 
        // at the start of the app
        loadDogImage()
    }
  
    // function for making a HTTP request using 
    // Volley and inserting the image in the
    // ImageView using Glide library.
    private fun loadDogImage() {
  
        // getting a new volley request 
        // queue for making new requests
        val volleyQueue = Volley.newRequestQueue(this)
          
        // url of the api through which we get random dog images
        val url = "https://dog.ceo/api/breeds/image/random"
          
        // since the response we get from the api is in JSON,
        // we need to use `JsonObjectRequest` for 
        // parsing the request response
        val jsonObjectRequest = JsonObjectRequest(
            // we are using GET HTTP request method
            Request.Method.GET,
            // url we want to send the HTTP request to
            url,
            // this parameter is used to send a JSON object 
            // to the server, since this is not required in 
            // our case, we are keeping it `null`
            null,
  
            // lambda function for handling the case
            // when the HTTP request succeeds
            { response ->
                // get the image url from the JSON object
                val dogImageUrl = response.get("message")
                // load the image into the ImageView using Glide.
                Glide.with(this).load(dogImageUrl).into(mDogImageView)
            },
  
            // lambda function for handling the 
            // case when the HTTP request fails
            { error ->
                // make a Toast telling the user
                // that something went wrong
                Toast.makeText(this, "Some error occurred! Cannot fetch dog image", Toast.LENGTH_LONG).show()
                // log the error message in the error stream
                Log.e("MainActivity", "loadDogImage error: ${error.localizedMessage}")
            }
        )
  
        // add the json request object created 
        // above to the Volley request queue
        volleyQueue.add(jsonObjectRequest)
    }
}

Java

import android.os.Bundle;
import android.util.Log;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.toolbox.JsonObjectRequest;
import com.android.volley.toolbox.Volley;
import com.bumptech.glide.Glide;
import org.json.JSONException;
import org.json.JSONObject;
  
public class MainActivity extends AppCompatActivity {
  
    // member variable for holding the ImageView 
    // in which images will be loaded
    ImageView mDogImageView;
    Button nextDogButton;
  
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
  
        // initialize the ImageView and the Button
        mDogImageView = findViewById(R.id.dogImageView);
        nextDogButton = findViewById(R.id.nextDogButton);
  
        // attaching on click listener to the button so that `loadDogImage()`
        // function is called everytime after clicking it.
        nextDogButton.setOnClickListener(View -> loadDogImage());
  
        // image of a dog will be loaded once at the start of the app
        loadDogImage();
    }
  
    // function for making a HTTP request using Volley and
    // inserting the image in the ImageView using Glide library
    private void loadDogImage() {
  
        // getting a new volley request queue for making new requests
        RequestQueue volleyQueue = Volley.newRequestQueue(MainActivity.this);
        // url of the api through which we get random dog images
        String url = "https://dog.ceo/api/breeds/image/random";
  
        // since the response we get from the api is in JSON, we 
        // need to use `JsonObjectRequest` for parsing the
        // request response
        JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(
            // we are using GET HTTP request method
            Request.Method.GET,
            // url we want to send the HTTP request to
            url,
            // this parameter is used to send a JSON object to the
            // server, since this is not required in our case,
            // we are keeping it `null`
            null,
  
            // lambda function for handling the case 
            // when the HTTP request succeeds
            (Response.Listener<JSONObject>) response -> {
                // get the image url from the JSON object
                String dogImageUrl;
                try {
                    dogImageUrl = response.getString("message");
                    // load the image into the ImageView using Glide.
                    Glide.with(MainActivity.this).load(dogImageUrl).into(mDogImageView);
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            },
  
            // lambda function for handling the case 
            // when the HTTP request fails
            (Response.ErrorListener) error -> {
                // make a Toast telling the user 
                // that something went wrong
                Toast.makeText(MainActivity.this, "Some error occurred! Cannot fetch dog image", Toast.LENGTH_LONG).show();
                // log the error message in the error stream
                Log.e("MainActivity", "loadDogImage error: ${error.localizedMessage}");
            }
        );
  
        // add the json request object created above
        // to the Volley request queue
        volleyQueue.add(jsonObjectRequest);
    }
}

Producción:

Publicación traducida automáticamente

Artículo escrito por anshul3pathi y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *