如何在RESTEasy客户端框架中设置HTTP标头?

RESTEasy(一个JAX-RS实现)有一个很好的客户端框架 ,例如:

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

你如何设置HTTP标头?

澄清:

jkeeler提出的解决方案是一种很好的方法,但我想在ProxyFactory级别设置HTTP标头,我不想将标头传递给客户端对象。 有任何想法吗?

使用RestEasy 3.x我使用ClientRequestFilters。 在下面的示例中,有一个持续集成(CI)服务器侦听在后台运行的请求。 测试和CI服务器使用相同的数据库和实体类。

假设名为“test-tenant”的租户确实存在,并且存在属于该租户的用户“root”,并且用户具有下面指定的密码。

 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)); } 

和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); } } 

import语句(假设您只是将测试和静态类粘贴到一个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; 

在客户端代理界面中,使用@HeaderParam注释:

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

上面示例中的调用将添加如下所示的HTTP标头:

 Greeting: hello world 

我找到了一个解决方案:

 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"); 

更容易:

  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"));