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



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

我假设您想将其添加到您戳的传出请求中。我先加上这个。

DW使用jersey(所以我假设您正在使用jersey客户机来执行您的任务)。jersey客户机使用(或可以使用)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]

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

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

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

我希望这对你有帮助!

阿图尔

最新更新