Con RestEasy 3.x utilizo ClientRequestFilters. En el ejemplo siguiente, hay un servidor de integración continua (CI) que escucha las solicitudes que se ejecutan en segundo plano. La prueba y el servidor de CI utilizan la misma base de datos y clases de entidad.
Supongamos que un inquilino llamado 'inquilino de prueba' existe de hecho, y hay un usuario 'raíz' que pertenece a ese inquilino, y el usuario tiene la contraseña especificada a continuación.
private static final String BASE_URI = "http://localhost:" + PORT;
@Test(groups = "functionalTests")
public void testGetTenant() throws Exception {
Client client = ClientBuilder.newClient();
ResteasyWebTarget target = (ResteasyWebTarget)client.target(BASE_URI);
client.register(new AddAuthHeadersRequestFilter("root", "DefaultPasswordsAre:-("));
TenantResource resource = target.proxy(TenantResource.class);
RestTenant restTenant = resource.getTenant(tenant.id().value().toString());
assertThat(restTenant.getName(), is("test-tenant"));
assertThat(restTenant.isActive(), is(true));
}
Y la clase AddAuthHeadersRequestFilter:
public static class AddAuthHeadersRequestFilter implements ClientRequestFilter {
private final String username;
private final String password;
public AddAuthHeadersRequestFilter(String username, String password) {
this.username = username;
this.password = password;
}
@Override
public void filter(ClientRequestContext requestContext) throws IOException {
String token = username + ":" + password;
String base64Token = Base64.encodeBase64String(token.getBytes(StandardCharsets.UTF_8));
requestContext.getHeaders().add("Authorization", "Basic " + base64Token);
}
}
Las declaraciones de importación (suponiendo que acaba de pegar la prueba y la clase estática en un solo archivo de clase de pruebas TestNG):
import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import org.jboss.resteasy.client.jaxrs.ResteasyWebTarget;
import org.testng.annotations.Test;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import javax.ws.rs.client.ClientRequestContext;
import javax.ws.rs.client.ClientRequestFilter;
import org.apache.commons.codec.binary.Base64;
¿Cómo sabe ProxyFactory acerca de su ejecutor? Parece inquietante "magia". –
@EricBowman - tienes razón, el código no era correcto. Lo he arreglado Debe pasar la variable 'executor' como parámetro al método' ProxyFactory.create() '. –