如何从dropwizard服务的所有出站http请求添加自定义标头?

时间:2016-08-23 19:32:26

标签: dropwizard

如何向来自dropwizard服务的所有出站org.apache.http.client.HttpClient请求添加自定义标头?例如,每当我的dropwizard服务中有来自任何类的出站http请求时,我想添加标题" X-Powered-By:foo"自动。

1 个答案:

答案 0 :(得分:3)

我假设您要将其添加到您发出的传出请求中。所以我先添加它。

DW使用平针织物(所以我假设你正在使用球衣客户端做你的戳)。泽西客户端使用apache客户端(或可以使用)来执行实际请求。

Jersey使用过滤器来完成您需要它做的事情。在这种情况下,由于您要为所有请求添加标头,因此您需要使用ClientRequestFilter。考虑这个例子:

public class HeaderTest {

    public static void main(String[] args) {
        // create the client
        Client newClient = ClientBuilder.newClient().register(MyClientRequestFilter.class).register(MyClientRequestPrintingFilter.class);

        // make a request
        newClient.target("http://google.com").request().get();
    }

    @Priority(1)
    public static class MyClientRequestFilter implements ClientRequestFilter {

        @Override
        public void filter(ClientRequestContext requestContext) throws IOException {
            System.out.println("Added header");
            requestContext.getHeaders().add("X-Powered-By", "foo");
        }

    }

    @Priority(2)
    public static class MyClientRequestPrintingFilter implements ClientRequestFilter {

        @Override
        public void filter(ClientRequestContext requestContext) throws IOException {
            requestContext.getHeaders().forEach((x,y) -> System.out.println("headerKey:" + x + " HEadervalue:" + y));
        }

    }
}

班级" MyClientRequestFilter"已注册到每个请求。将始终执行此代码(例如,为每个请求添加标头)。

第二个过滤器只打印请求中的所有标题。运行此代码我得到:

Added header
headerKey:X-Powered-By HEadervalue:[foo]

我相信这就是你所需要的。

或者(如果我误解了),您可以为服务器正在执行的每个响应添加标头。这将是将执行do:

的过滤器(注意:ContainerResponseFilter)
public static class MyHeaderResponseFilter implements ContainerResponseFilter {

        @Override
        public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext)
                throws IOException {
            responseContext.getHeaders().add("X-Powered-By", "foo");
        }

    }

测试:

artur@pandaadb:~/dev/eclipse/eclipse_jee$ curl -v "localhost:9085/api/test/asd"
*   Trying 127.0.0.1...
* Connected to localhost (127.0.0.1) port 9085 (#0)
> GET /api/test/asd HTTP/1.1
> Host: localhost:9085
> User-Agent: curl/7.47.0
> Accept: */*
> 
< HTTP/1.1 200 OK
< Date: Wed, 24 Aug 2016 09:21:19 GMT
< Content-Type: application/json
< X-Powered-By: foo
< Vary: Accept-Encoding
< Content-Length: 5
< 
* Connection #0 to host localhost left intact
Hello

我希望有所帮助!

Artur