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

2022-09-02 14:23:48

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

RegisterBuiltin.register(ResteasyProviderFactory.getInstance());

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

如何设置 HTTP 标头?

澄清:

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


答案 1

在客户端代理接口中,使用注释:@HeaderParam

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

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

Greeting: hello world

答案 2

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

推荐