diff --git a/spring-cloud/spring-cloud-zuul/pom.xml b/spring-cloud/spring-cloud-zuul/pom.xml index b1f2e886de..e0a63ae00b 100644 --- a/spring-cloud/spring-cloud-zuul/pom.xml +++ b/spring-cloud/spring-cloud-zuul/pom.xml @@ -19,6 +19,7 @@ spring-zuul-foos-resource spring-zuul-ui spring-zuul-rate-limiting + spring-zuul-post-filter diff --git a/spring-cloud/spring-cloud-zuul/spring-zuul-post-filter/.gitignore b/spring-cloud/spring-cloud-zuul/spring-zuul-post-filter/.gitignore new file mode 100644 index 0000000000..0af075f75a --- /dev/null +++ b/spring-cloud/spring-cloud-zuul/spring-zuul-post-filter/.gitignore @@ -0,0 +1,2 @@ +target/* +*.iml diff --git a/spring-cloud/spring-cloud-zuul/spring-zuul-post-filter/pom.xml b/spring-cloud/spring-cloud-zuul/spring-zuul-post-filter/pom.xml new file mode 100644 index 0000000000..c13aeb890e --- /dev/null +++ b/spring-cloud/spring-cloud-zuul/spring-zuul-post-filter/pom.xml @@ -0,0 +1,25 @@ + + + + spring-cloud-zuul + com.baeldung.spring.cloud + 0.0.1-SNAPSHOT + + 4.0.0 + spring-zuul-post-filter + + + Hoxton.SR1 + + + + + org.springframework.cloud + spring-cloud-starter-netflix-zuul + + + + + \ No newline at end of file diff --git a/spring-cloud/spring-cloud-zuul/spring-zuul-post-filter/src/main/java/com/baeldung/ZuulPostFilterApplication.java b/spring-cloud/spring-cloud-zuul/spring-zuul-post-filter/src/main/java/com/baeldung/ZuulPostFilterApplication.java new file mode 100644 index 0000000000..c9aad4e08d --- /dev/null +++ b/spring-cloud/spring-cloud-zuul/spring-zuul-post-filter/src/main/java/com/baeldung/ZuulPostFilterApplication.java @@ -0,0 +1,14 @@ +package com.baeldung; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.netflix.zuul.EnableZuulProxy; + +@SpringBootApplication +@EnableZuulProxy +public class ZuulPostFilterApplication { + + public static void main(String... args) { + SpringApplication.run(ZuulPostFilterApplication.class, args); + } +} diff --git a/spring-cloud/spring-cloud-zuul/spring-zuul-post-filter/src/main/java/com/baeldung/controllers/GreetingController.java b/spring-cloud/spring-cloud-zuul/spring-zuul-post-filter/src/main/java/com/baeldung/controllers/GreetingController.java new file mode 100644 index 0000000000..bd21b098ab --- /dev/null +++ b/spring-cloud/spring-cloud-zuul/spring-zuul-post-filter/src/main/java/com/baeldung/controllers/GreetingController.java @@ -0,0 +1,16 @@ +package com.baeldung.controllers; + +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; + +@Controller +@RequestMapping("/greeting") +public class GreetingController { + + @GetMapping("/simple") + public ResponseEntity getSimple() { + return ResponseEntity.ok("Hi"); + } +} diff --git a/spring-cloud/spring-cloud-zuul/spring-zuul-post-filter/src/main/java/com/baeldung/filters/ResponseLogFilter.java b/spring-cloud/spring-cloud-zuul/spring-zuul-post-filter/src/main/java/com/baeldung/filters/ResponseLogFilter.java new file mode 100644 index 0000000000..e589e27d46 --- /dev/null +++ b/spring-cloud/spring-cloud-zuul/spring-zuul-post-filter/src/main/java/com/baeldung/filters/ResponseLogFilter.java @@ -0,0 +1,58 @@ +package com.baeldung.filters; + +import com.google.common.io.CharStreams; +import com.netflix.zuul.ZuulFilter; +import com.netflix.zuul.context.RequestContext; +import com.netflix.zuul.exception.ZuulException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +import java.io.InputStream; +import java.io.InputStreamReader; + +import static org.springframework.cloud.netflix.zuul.filters.support.FilterConstants.POST_TYPE; + +@Component +public class ResponseLogFilter extends ZuulFilter { + + private Logger logger = LoggerFactory.getLogger(ResponseLogFilter.class); + + @Override + public String filterType() { + return POST_TYPE; + } + + @Override + public int filterOrder() { + return 0; + } + + @Override + public boolean shouldFilter() { + return true; + } + + @Override + public Object run() throws ZuulException { + + RequestContext context = RequestContext.getCurrentContext(); + try (final InputStream responseDataStream = context.getResponseDataStream()) { + + if(responseDataStream == null) { + logger.info("BODY: {}", ""); + return null; + } + + String responseData = CharStreams.toString(new InputStreamReader(responseDataStream, "UTF-8")); + logger.info("BODY: {}", responseData); + + context.setResponseBody(responseData); + } + catch (Throwable e) { + e.printStackTrace(); + } + + return null; + } +} diff --git a/spring-cloud/spring-cloud-zuul/spring-zuul-post-filter/src/main/resources/application.yml b/spring-cloud/spring-cloud-zuul/spring-zuul-post-filter/src/main/resources/application.yml new file mode 100644 index 0000000000..ebcc7c8be7 --- /dev/null +++ b/spring-cloud/spring-cloud-zuul/spring-zuul-post-filter/src/main/resources/application.yml @@ -0,0 +1,11 @@ +server: + port: 8080 +zuul: + prefix: /api + routes: + greeting-service: + path: /greeting/** + url: forward:/greeting + foos-service: + path: /foos/** + url: http://localhost:8081/spring-zuul-foos-resource/foos \ No newline at end of file diff --git a/spring-cloud/spring-cloud-zuul/spring-zuul-post-filter/src/test/java/com/baeldung/ZuulPostFilterLiveTest.java b/spring-cloud/spring-cloud-zuul/spring-zuul-post-filter/src/test/java/com/baeldung/ZuulPostFilterLiveTest.java new file mode 100644 index 0000000000..475508879e --- /dev/null +++ b/spring-cloud/spring-cloud-zuul/spring-zuul-post-filter/src/test/java/com/baeldung/ZuulPostFilterLiveTest.java @@ -0,0 +1,30 @@ +package com.baeldung; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.web.client.TestRestTemplate; +import org.springframework.boot.web.server.LocalServerPort; +import org.springframework.http.ResponseEntity; +import org.springframework.test.context.junit4.SpringRunner; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +@RunWith(SpringRunner.class) +@SpringBootTest(webEnvironment= SpringBootTest.WebEnvironment.DEFINED_PORT) +public class ZuulPostFilterLiveTest { + + @LocalServerPort + private int port; + private static final String SIMPLE_GREETING = "/api/greeting/simple"; + private TestRestTemplate restTemplate = new TestRestTemplate(); + + @Test + public void whenClientCallApi_thenLogAndReturnResponseBody() { + String url = "http://localhost:" + port + SIMPLE_GREETING; + ResponseEntity response = restTemplate.getForEntity(url, String.class); + assertTrue(response.getStatusCode().is2xxSuccessful()); + assertEquals(response.getBody(), "Hi"); + } +}