example code for BAEL-3749 (#8679)

* example code for BAEL-3749

* added live test

* added live test
This commit is contained in:
Seun Matt 2020-02-09 05:10:23 +01:00 committed by GitHub
parent fbbafeb4d2
commit 4869ddbc3e
8 changed files with 157 additions and 0 deletions

View File

@ -19,6 +19,7 @@
<module>spring-zuul-foos-resource</module>
<module>spring-zuul-ui</module>
<module>spring-zuul-rate-limiting</module>
<module>spring-zuul-post-filter</module>
</modules>
<dependencyManagement>

View File

@ -0,0 +1,2 @@
target/*
*.iml

View File

@ -0,0 +1,25 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>spring-cloud-zuul</artifactId>
<groupId>com.baeldung.spring.cloud</groupId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>spring-zuul-post-filter</artifactId>
<properties>
<spring-cloud.version>Hoxton.SR1</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
</dependencies>
</project>

View File

@ -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);
}
}

View File

@ -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<String> getSimple() {
return ResponseEntity.ok("Hi");
}
}

View File

@ -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;
}
}

View File

@ -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

View File

@ -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<String> response = restTemplate.getForEntity(url, String.class);
assertTrue(response.getStatusCode().is2xxSuccessful());
assertEquals(response.getBody(), "Hi");
}
}