2011-08-03 16 views
12

RESTEasy (una aplicación JAX-RS) tiene un bonito client framework, por ejemplo:¿Cómo establecer el encabezado HTTP en el marco de cliente RESTEasy?

RegisterBuiltin.register(ResteasyProviderFactory.getInstance()); 

SimpleClient client = ProxyFactory.create(SimpleClient.class, "http://localhost:8081"); 
client.putBasic("hello world"); 

Como fijo encabezados HTTP?

Aclaración:

La solución propuesta por jkeeler es un buen enfoque, pero desea establecer cabeceras HTTP en el nivel ProxyFactory y no quiero pasar cabeceras al objeto de cliente. ¿Algunas ideas?

Respuesta

11

He encontrado una solución :

import org.apache.commons.httpclient.HttpClient; 
import org.jboss.resteasy.client.ClientRequest; 
import org.jboss.resteasy.client.ClientResponse; 
import org.jboss.resteasy.client.ProxyFactory; 
import org.jboss.resteasy.client.core.executors.ApacheHttpClientExecutor; 
import org.jboss.resteasy.plugins.providers.RegisterBuiltin; 
import org.jboss.resteasy.spi.ResteasyProviderFactory; 

RegisterBuiltin.register(ResteasyProviderFactory.getInstance()); 
HttpClient httpClient = new HttpClient(); 
ApacheHttpClientExecutor executor = new ApacheHttpClientExecutor(httpClient) { 
    @Override 
    public ClientResponse execute(ClientRequest request) throws Exception { 
     request.header("X-My-Header", "value"); 
     return super.execute(request); 
    }   
}; 

SimpleClient client = ProxyFactory.create(SimpleClient.class, "http://localhost:8081", executor); 
client.putBasic("hello world"); 
+0

¿Cómo sabe ProxyFactory acerca de su ejecutor? Parece inquietante "magia". –

+0

@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() '. –

11

En la interfaz de proxy de cliente, utilice el @HeaderParam anotación:

public interface SimpleClient 
{ 
    @PUT 
    @Path("basic") 
    @Consumes("text/plain") 
    public void putBasic(@HeaderParam("Greeting") String greeting); 
} 

La llamada en tu ejemplo anterior sería añadir una cabecera HTTP que tiene este aspecto:

Greeting: hello world 
+0

Gracias, este es un buen enfoque, pero estoy buscando otra solución. He aclarado la pregunta. –

+0

@jkeeler justo lo que estoy buscando? ¿Tiene una manera fácil de poner este parámetro requerido en todos mis métodos en esta interfaz? tks –

17

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; 
8

Aún más fácil:

ResteasyClient client = new ResteasyClientBuilder().build(); 
    ResteasyWebTarget target = client.target("https://test.com"); 
    Response response = target.request().header("Authorization", "Basic test123") 
      .acceptEncoding("gzip, deflate") 
      .post(Entity.entity(some_xml, "application/x-www-form-urlencoded")); 
Cuestiones relacionadas