Normalmente las interacciones con las múltiples APIs que existen, varían mucho, sobretodo con el tipo de autenticación que se utiliza, ya sea oauth 1.0 o 2.0, usuario y contraseña, alguna licencia o una interacción 100% por json y sin usar encabezados.

Para esta ocasión vamos enviar los headers utilizando un objeto de tipo MultivaluedMap y para la interacción con el API deberemos añadir los siguientes imports:

import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.Entity;
import javax.ws.rs.client.Invocation;
import javax.ws.rs.client.WebTarget;
import javax.ws.rs.core.Form;
import javax.ws.rs.core.MultivaluedHashMap;
import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.core.Response;

El objeto MultivaluedMap permite crear una lista mapeable para enviar múltiples valores por el header de una solicitud, funciona parecido a un HashMap, sin embargo, este es especial para enviar múltiples valores sobre una misma clave, a diferencia del hashmap que solo permite enviar un solo valor por clave.

El siguiente ejemplo muestra como realizar la declaración y el mapeo de valores en un MultivaluedMap:

Invocation.Builder solicitud = target.request();
MultivaluedMap<String, Object> myHeaders = new MultivaluedHashMap<String, Object>();
                myHeaders.add("Authorization", "Basic " + authentication);
                myHeaders.add("Content-Type", "application/x-www-form-urlencoded");
                myHeaders.add("Accept", "application/json");
                myHeaders.add("grant_type", "client_credentials");
				solicitud.headers(myHeaders);//asignamos la lista de headers a la solicitud

Este será la lista que utilizaremos para enviar la solicitud de autenticación; en el siguiente ejemplo, muestro como se puede utilizar en un proceso de llamada de token en oauth 2.0:

public String autenticacion(String url) { //Se envía el url del API a interactuar
        String res;
        try {
                Client client = ClientBuilder.newClient();
                WebTarget target = client.target(url + "/oauth/token");
                Invocation.Builder solicitud = target.request();
                MultivaluedMap<String, Object> myHeaders = new MultivaluedHashMap<String, Object>();
                myHeaders.add("Authorization", "Basic " + authentication);//autenticacion es la clave en base64 necesaria para la autorización con el API
                myHeaders.add("Content-Type", "application/x-www-form-urlencoded");
                myHeaders.add("Accept", "application/json");
                myHeaders.add("grant_type", "client_credentials");
                solicitud.headers(myHeaders);
          
                Form form = new Form();
                    form.param("grant_type", "client_credentials")
                            .param("client_id", client_id)
                            .param("client_secret", client_secret);
                Response post = solicitud.post(Entity.form(form));
                JsonObject responseJson = post.readEntity(JsonObject.class);
                switch (post.getStatus()) {
                    case 200:
                         accessToken = responseJson.getString("access_token");
                         res = accessToken;
                         break;
                    default:
                         res = "Error en la autenticacion " + post.getHeaderString("X-Error-Cause");
                         break;
                           }
            } catch (Exception e) {
                res = "Error en la autenticacion " + " " + e.toString();
            }
            return res;
        }

De esta manera podemos interactuar con APIs que necesiten múltiples headers en la solicitud, esto no será algo que siempre se necesite hacer, sin embargo, he notado que ciertos tipos de APIs lo solicitan para el proceso de autenticación.

Deja una respuesta

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