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

Java 如何在RESTEasy客户端框架中设置HTTP头?,java,http-headers,jax-rs,resteasy,Java,Http Headers,Jax Rs,Resteasy,RESTEasy(一个JAX-RS实现)有一个很好的解决方案,例如: 如何设置HTTP头 澄清: 提出的解决方案是一种很好的方法,但我想在代理工厂级别设置HTTP头,而不想将头传递给客户机对象。有什么想法吗?在客户端代理界面中,使用@HeaderParam注释: public interface SimpleClient { @PUT @Path("basic") @Consumes("text/plain") public void putBasic(@HeaderPa

RESTEasy(一个JAX-RS实现)有一个很好的解决方案,例如:

如何设置HTTP头

澄清:


提出的解决方案是一种很好的方法,但我想在代理工厂级别设置HTTP头,而不想将头传递给客户机对象。有什么想法吗?

在客户端代理界面中,使用
@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");

对于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);
    }
}
导入语句(假设您只是将测试和静态类粘贴到单个TestNg测试类文件中):

更简单的是:

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

谢谢,这是一个很好的方法,但我正在寻找其他解决方案。我已经澄清了这个问题。@jkeeler我在找什么?有没有一个简单的方法可以将这个参数放在这个接口中我所有的方法中??tks+1对于这种方法-当需要一个头(即“授权”)时,在接口中指定它会更干净。ProxyFactory如何知道您的执行者?看起来令人不安的“魔法”。@EricBowman-你说得对,代码不正确。我已经修好了。您必须将
executor
变量作为参数传递给
ProxyFactory.create()
方法。这是一个很好的答案,但更好:
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;
    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"));