viernes, 13 de mayo de 2022

Java REST client (I) :Post con parametros de formulario

 1. Introducción

Tengo que conseguir un "token" que me servira para consumir la REST api para un aplicación que estoy intentando integrar con otra.

Para ello me suministran:

1. la URL a la cual llamar (por ejemplo ficticiamente: 

 https://empresaauthorization.es/identity/connect/token

2. Usuario y contraseña como parámetros:

Parametro:  "username" valor: "miUsuario"

Parametro: "password"  valor: "miClave"

3. Otros parametros adicionales

Parametro:  "grant_type" valor: "password"

Parametro: "scope"  valor: "miAplicacion"

Parametro: "client_id"  valor: "yoMismo"

Parametro: "client_secret"  valor: "AH0124EF5832HA321"



2. Llamadas

Con "curl" se haría así:

curl -X POST --data "username=miUsuario&password=miClave&grant_type=password&scope=miAplicacion&client_id=yoMismo&client_secret=AH0124EF5832HA321" -k https://empresaauthorization.es/identity/connect/token

En cambio en Java he creado este módulo que me ha hecho penar:

En gradle le he dado esta dependencia

implementation 'org.apache.httpcomponents:httpclient:4.5.13'

package ph.utils;

import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

import org.apache.http.HttpEntity;
import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;

import org.apache.http.util.EntityUtils;

public class HttpXimo {
	private CloseableHttpClient httpclient = null;
	private String url = null;

	public HttpEdu(String url) {
		this.url = url;
		try {
			httpclient = HttpClients.createDefault();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public String post(String[] paramNames, String[] paramValues) throws Exception {
		
		HttpPost httpPost = new HttpPost(this.url);
		List<NameValuePair> nvps = new ArrayList<>();

		//Add form parameters
		for (int i = 0; i < paramNames.length; i++)
			nvps.add(new BasicNameValuePair(paramNames[i], paramValues[i]));
		
		//Encode url
		httpPost.setEntity(new UrlEncodedFormEntity(nvps));
		
		//Get response
		CloseableHttpResponse response2 = httpclient.execute(httpPost);
		HttpEntity entity2 = response2.getEntity();
		
		//Read the response from input stream
		InputStream in = entity2.getContent();
		String s = new String(in.readAllBytes());
		
		//Close input stream
		EntityUtils.consume(entity2);
		return s;

	}

        public static void main(String[] args) throws Exception {
		HttpXimo myHttp = new HttpEdu("https://empresaauthorization.es/identity/connect/token");
		String[] names = { "username", "password", "grant_type", "scope", "client_id", "client_secret" };
		String[] values = { "Parametro", "miClave", "password", "miAplicacion",
				"yoMismo", "AH0124EF5832HA321" };

		System.out.println("HOLA=" + myHttp.post(names, values));
	}

	

Y la respuesta que obtenemos es esta (en formato JSON)

{"access_token":"eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6IjF6ZTUxZnlxcFFZVkJVaTJlMzVTRmVxX0J0byIsImtpZCI6IjF6ZTUxZnlxcFFZVkJVaTJlMzVTRmVxX0J0byJ9.eyJjbGllbnRfaWQiOiJJbnRlcnB1YmxpY2EiLCJzY29wZSI6IkludGVycHVibGljYSIsInN1YiI6IjMzOTBlYjAyLTRiM2ItNDVmMy1iMzk3LWEzMDhmOWQ2YTNlNCIsImFbciI6WyJwYXNzd29yZCJdLCJhdvRoX3RpbWUiOjE2NTI0MjIxMjgsImlkcCI6Imlkc3J2IiwicHJlZmVycmVkX3VzZXJuYW1lIjoiVGF2ZXJuZXNWYWxsZGlnbmFTZWRpIiwiZW1haWwiOiJub0Buby5jb20iLCJlbWFpbF92ZXJpZmllZCI6InRydWUiLCJwaG9uZV9udW1iZXIiOiIxMjM0NTY3ODkiLCJwaG9uZV9udW1iZXJfdmVyaWZpZWQiOiJ0cnVlIiwiVXN1YXJpbyI6IjM0MyIsIlNlcnZpZG9yIjoiMiIsIkRvbWluaW8iOiI0IiwiRW50aWRhZCI6IjM0MyIsInJvbGUiOlsiRG9tYWluIiwiSW50ZXJwdWJsaWNhIiwiUGFkcm9uIl0sImp0aSI6ImQxNzNiZTY5ZGRjOWUxMDYyNDkzZjZlYzNiMDgxMWIzIiwiaXNzIjoiaHR0cHM6Ly9pbnRlcnB1YmxpY2FhdXRob3JpemF0aW9uLmRpdmFsLmVzL2lkZW50aXR5IiwiYXVkIjoiaHR0cHM6Ly9pbnRlcnB1YmxpY2FhdXRob3JpemF0aW9uLmRpdmFsLmVzL2lkZW50aXR5L3Jlc291cmNlcyIsImV4cCI6MTY1MjQyNTcyOCwibmJmIjoxNjUyNDIyMTI4fQ.ewb85x5PDL6gGvhdeZUlhn15DfGfZ4TgeTB7nY5RvAmUF0tFUs-gG38cZ5LcF87yVALlPzB8gwKMbVHfXVseO2cXpiQTxlF4xLF006aDXT1zN9bTIcFb55BUyDFeJmQyzW_euUi8KX0kKDK3XCkS01LvK_7NGIGeL_M78m7_4LumqnurWUAv2JEApIBZkBFXZ_zREk1LzJt1Pqlt6muTcS8XEZsLXK8EoTNjWkkHZzU0VdXArwSy-RKQRm3HbOr43eV96eMAKudoY8nbAeeqzsS5_qLk7soNUihwlvoM9A-EdjDsySFf_KxTtWAyemkdoE5PRPTAwmXoYPBuwKOwdw","expires_in":3600,"token_type":"Bearer"}

Para leer la respuesta se añade este código sustituyendo al método "main"


        public String getKeyValue(String jsonString, String key) throws JsonMappingException, JsonProcessingException {
		ObjectMapper  objMapper= new ObjectMapper();
		Map<String,String>mp=new HashMap<>();
		mp=objMapper.readValue(jsonString, mp.getClass());
		return mp.get(key);
	}	
	
	
	public static void main(String[] args) throws Exception {
		HttpXimo myHttp = new HttpEdu("https://interpublicaauthorization.dival.es/identity/connect/token");
		String[] names = { "username", "password", "grant_type", "scope", "client_id", "client_secret" };
		String[] values = { "Parametro", "miClave", "password", "miAplicacion",
				"yoMismo", "AH0124EF5832HA321" };
String strResponse= myHttp.post(names, values); System.out.println(strResponse); String token =myHttp.getKeyValue(strResponse, "access_token"); System.out.println(token); }

Ahora ya tenemos el token, vamos a por la segunda parte que consiste en utilizar este token para usar la REST API











No hay comentarios :

Publicar un comentario