下面列出了org.springframework.http.ResponseEntity#getHeaders ( ) 实例代码,或者点击链接到github查看源代码,也可以在右侧发表评论。
@Test
public void testExceedingCapacity() {
ResponseEntity<String> response = this.restTemplate.getForEntity("/serviceB", String.class);
HttpHeaders headers = response.getHeaders();
String key = "rate-limit-application_serviceB_127.0.0.1";
assertHeaders(headers, key, false, false);
assertEquals(OK, response.getStatusCode());
for (int i = 0; i < 2; i++) {
response = this.restTemplate.getForEntity("/serviceB", String.class);
}
assertEquals(TOO_MANY_REQUESTS, response.getStatusCode());
assertNotEquals(SpringDataApplication.ServiceController.RESPONSE_BODY, response.getBody());
await().pollDelay(2, TimeUnit.SECONDS).untilAsserted(() -> {
final ResponseEntity<String> responseAfterReset = this.restTemplate
.getForEntity("/serviceB", String.class);
final HttpHeaders headersAfterReset = responseAfterReset.getHeaders();
assertHeaders(headersAfterReset, key, false, false);
assertEquals(OK, responseAfterReset.getStatusCode());
});
}
@Test
public void testExceedingCapacity() {
ResponseEntity<String> response = this.restTemplate.getForEntity("/serviceB", String.class);
HttpHeaders headers = response.getHeaders();
String key = "rate-limit-application_serviceB_127.0.0.1";
assertHeaders(headers, key, false, false);
assertEquals(OK, response.getStatusCode());
for (int i = 0; i < 2; i++) {
response = this.restTemplate.getForEntity("/serviceB", String.class);
}
assertEquals(TOO_MANY_REQUESTS, response.getStatusCode());
assertNotEquals(ConsulApplication.ServiceController.RESPONSE_BODY, response.getBody());
await().pollDelay(2, TimeUnit.SECONDS).untilAsserted(() -> {
final ResponseEntity<String> responseAfterReset = this.restTemplate
.getForEntity("/serviceB", String.class);
final HttpHeaders headersAfterReset = responseAfterReset.getHeaders();
assertHeaders(headersAfterReset, key, false, false);
assertEquals(OK, responseAfterReset.getStatusCode());
});
}
@Test
public void testExceedingCapacity() {
ResponseEntity<String> response = this.restTemplate.getForEntity("/serviceB", String.class);
HttpHeaders headers = response.getHeaders();
String key = "rate-limit-application_serviceB_127.0.0.1";
assertHeaders(headers, key, false, false);
assertEquals(OK, response.getStatusCode());
for (int i = 0; i < 2; i++) {
response = this.restTemplate.getForEntity("/serviceB", String.class);
}
assertEquals(TOO_MANY_REQUESTS, response.getStatusCode());
assertNotEquals(RedisApplication.ServiceController.RESPONSE_BODY, response.getBody());
await().pollDelay(2, TimeUnit.SECONDS).untilAsserted(() -> {
final ResponseEntity<String> responseAfterReset = this.restTemplate
.getForEntity("/serviceB", String.class);
final HttpHeaders headersAfterReset = responseAfterReset.getHeaders();
assertHeaders(headersAfterReset, key, false, false);
assertEquals(OK, responseAfterReset.getStatusCode());
});
}
@Test
public void testMultipleUrls() {
String randomPath = UUID.randomUUID().toString();
for (int i = 0; i < 12; i++) {
if (i % 2 == 0) {
randomPath = UUID.randomUUID().toString();
}
ResponseEntity<String> response = this.restTemplate.getForEntity("/serviceD/" + randomPath, String.class);
HttpHeaders headers = response.getHeaders();
assertHeaders(headers, "rate-limit-application_serviceD_serviceD_" + randomPath, false, false);
assertEquals(OK, response.getStatusCode());
}
}
@Test
public void testNoRateLimit() {
ResponseEntity<String> response = this.restTemplate.getForEntity("/serviceC", String.class);
HttpHeaders headers = response.getHeaders();
assertHeaders(headers, "rate-limit-application_serviceC", true, false);
assertEquals(OK, response.getStatusCode());
}
@Test
public void testUsingBreakOnMatchSpecificCase() {
ResponseEntity<String> response = this.restTemplate.getForEntity("/serviceF", String.class);
HttpHeaders headers = response.getHeaders();
String key = "rate-limit-application_serviceF_127.0.0.1_127.0.0.1";
assertHeaders(headers, key, false, false);
assertEquals(OK, response.getStatusCode());
response = this.restTemplate.getForEntity("/serviceF", String.class);
headers = response.getHeaders();
assertHeaders(headers, key, false, false);
assertEquals(OK, response.getStatusCode());
}
@Test
public void whenFilterWithExtraHeaderRequest_thenObtainResponseWithCorrectHeaders() {
final String requestUrl = "/extra-header";
ResponseEntity<String> response = template.getForEntity(FILTER_BASE_URL + requestUrl, String.class);
HttpHeaders responseHeaders = response.getHeaders();
assertThat(responseHeaders).isNotEmpty();
assertThat(responseHeaders).containsEntry(SERVICE_FILTER_RESPONSE_HEADER, Arrays.asList("Value-Filter"));
assertThat(responseHeaders).containsEntry(SERVICE_SINGLE_RESPONSE_HEADER, Arrays.asList("Value-ExtraHeader"));
}
/**
* Post-process Problem payload to add the message key for front-end if needed
*/
@Override
public ResponseEntity<Problem> process(@Nullable ResponseEntity<Problem> entity, NativeWebRequest request) {
if (entity == null || entity.getBody() == null) {
return entity;
}
Problem problem = entity.getBody();
if (!(problem instanceof ConstraintViolationProblem || problem instanceof DefaultProblem)) {
return entity;
}
ProblemBuilder builder = Problem.builder()
.withType(Problem.DEFAULT_TYPE.equals(problem.getType()) ? ErrorConstants.DEFAULT_TYPE : problem.getType())
.withStatus(problem.getStatus())
.withTitle(problem.getTitle())
.with("path", request.getNativeRequest(HttpServletRequest.class).getRequestURI());
if (problem instanceof ConstraintViolationProblem) {
builder
.with("violations", ((ConstraintViolationProblem) problem).getViolations())
.with("message", ErrorConstants.ERR_VALIDATION);
return new ResponseEntity<>(builder.build(), entity.getHeaders(), entity.getStatusCode());
} else {
builder
.withCause(((DefaultProblem) problem).getCause())
.withDetail(problem.getDetail())
.withInstance(problem.getInstance());
problem.getParameters().forEach(builder::with);
if (!problem.getParameters().containsKey("message") && problem.getStatus() != null) {
builder.with("message", "error.http." + problem.getStatus().getStatusCode());
}
return new ResponseEntity<>(builder.build(), entity.getHeaders(), entity.getStatusCode());
}
}
/**
* Posts data to the url given.
*
* @param url the URL the POST request is sent
* @param postData list of input data for the POST requests
* @param numberOfTimes the number of POST requests
* @param cookies the cookies to set on the request, optional - null is a valid value
* @return the a list of HTTP Responses
* @throws IOException, InterruptedException
*/
public List<HttpResponse> post(String url, List<HttpPostData> postData, int numberOfTimes, List<HttpCookie> cookies) throws IOException, InterruptedException{
Assert.hasLength(url, "URL cannot be null");
Assert.notEmpty(postData,"POST request cannot have empty post data");
Assert.isTrue(numberOfTimes > 0, "numberOfTimes cannot be 0");
List<HttpResponse> responses = new ArrayList<HttpResponse>(numberOfTimes);
RestTemplate restTemplate = new RestTemplate();
HttpHeaders headers = new HttpHeaders();
for (HttpCookie cookie : cookies) {
headers.add("Cookie", cookie.getKey()+"="+cookie.getValue());
}
for (int i = 0; i < numberOfTimes; i++) {
HttpEntity<String> entity = new HttpEntity<String>(addParameters(postData), headers);
ResponseEntity<String> response = restTemplate.exchange(url,
HttpMethod.POST, entity, String.class);
HttpResponse httpResponse = new HttpResponse(response.getStatusCode(),response.getBody(),response.getHeaders());
responses.add(httpResponse);
}
return responses;
}
@Test
public void whenRequestExceedingCapacity_thenReturnTooManyRequestsResponse() throws InterruptedException {
ResponseEntity<String> response = this.restTemplate.getForEntity(ADVANCED_GREETING, String.class);
HttpHeaders headers = response.getHeaders();
String key = "rate-limit-application_serviceAdvanced_127.0.0.1";
assertHeaders(headers, key, false, false);
assertEquals(OK, response.getStatusCode());
for (int i = 0; i < 2; i++) {
response = this.restTemplate.getForEntity(ADVANCED_GREETING, String.class);
}
headers = response.getHeaders();
String limit = headers.getFirst(HEADER_LIMIT + key);
String remaining = headers.getFirst(HEADER_REMAINING + key);
String reset = headers.getFirst(HEADER_RESET + key);
assertEquals(limit, "1");
assertEquals(remaining, "0");
assertNotEquals(reset, "2000");
assertEquals(TOO_MANY_REQUESTS, response.getStatusCode());
TimeUnit.SECONDS.sleep(2);
response = this.restTemplate.getForEntity(ADVANCED_GREETING, String.class);
headers = response.getHeaders();
assertHeaders(headers, key, false, false);
assertEquals(OK, response.getStatusCode());
}
/**
* Post-process the Problem payload to add the message key for the front-end if needed
*/
@Override
public ResponseEntity<Problem> process(@Nullable ResponseEntity<Problem> entity, NativeWebRequest request) {
if (entity == null) {
return entity;
}
Problem problem = entity.getBody();
if (!(problem instanceof ConstraintViolationProblem || problem instanceof DefaultProblem)) {
return entity;
}
ProblemBuilder builder = Problem.builder()
.withType(Problem.DEFAULT_TYPE.equals(problem.getType()) ? ErrorConstants.DEFAULT_TYPE : problem.getType())
.withStatus(problem.getStatus())
.withTitle(problem.getTitle())
.with("path", request.getNativeRequest(HttpServletRequest.class).getRequestURI());
if (problem instanceof ConstraintViolationProblem) {
builder
.with("violations", ((ConstraintViolationProblem) problem).getViolations())
.with("message", ErrorConstants.ERR_VALIDATION);
} else {
builder
.withCause(((DefaultProblem) problem).getCause())
.withDetail(problem.getDetail())
.withInstance(problem.getInstance());
problem.getParameters().forEach(builder::with);
if (!problem.getParameters().containsKey("message") && problem.getStatus() != null) {
builder.with("message", "error.http." + problem.getStatus().getStatusCode());
}
}
return new ResponseEntity<>(builder.build(), entity.getHeaders(), entity.getStatusCode());
}
@Test
public void testExceedingQuotaCapacityRequest() {
ResponseEntity<String> response = this.restTemplate.getForEntity("/serviceE", String.class);
HttpHeaders headers = response.getHeaders();
String key = "rate-limit-application_serviceE_127.0.0.1";
assertHeaders(headers, key, false, true);
assertEquals(OK, response.getStatusCode());
response = this.restTemplate.getForEntity("/serviceE", String.class);
headers = response.getHeaders();
assertHeaders(headers, key, false, true);
assertEquals(TOO_MANY_REQUESTS, response.getStatusCode());
}
/**
* Post-process Problem payload to add the message key for front-end if needed
*/
@Override
public ResponseEntity<Problem> process(@Nullable ResponseEntity<Problem> entity, NativeWebRequest request) {
if (entity == null || entity.getBody() == null) {
return entity;
}
Problem problem = entity.getBody();
if (!(problem instanceof ConstraintViolationProblem || problem instanceof DefaultProblem)) {
return entity;
}
ProblemBuilder builder = Problem.builder()
.withType(Problem.DEFAULT_TYPE.equals(problem.getType()) ? ErrorConstants.DEFAULT_TYPE : problem.getType())
.withStatus(problem.getStatus())
.withTitle(problem.getTitle())
.with("path", request.getNativeRequest(HttpServletRequest.class).getRequestURI());
if (problem instanceof ConstraintViolationProblem) {
builder
.with("violations", ((ConstraintViolationProblem) problem).getViolations())
.with("message", ErrorConstants.ERR_VALIDATION);
return new ResponseEntity<>(builder.build(), entity.getHeaders(), entity.getStatusCode());
} else {
builder
.withCause(((DefaultProblem) problem).getCause())
.withDetail(problem.getDetail())
.withInstance(problem.getInstance());
problem.getParameters().forEach(builder::with);
if (!problem.getParameters().containsKey("message") && problem.getStatus() != null) {
builder.with("message", "error.http." + problem.getStatus().getStatusCode());
}
return new ResponseEntity<>(builder.build(), entity.getHeaders(), entity.getStatusCode());
}
}
@Test
public void testExceedingQuotaCapacityRequest() {
ResponseEntity<String> response = this.restTemplate.getForEntity("/serviceE", String.class);
HttpHeaders headers = response.getHeaders();
String key = "rate-limit-application_serviceE_127.0.0.1";
assertHeaders(headers, key, false, true);
assertEquals(OK, response.getStatusCode());
response = this.restTemplate.getForEntity("/serviceE", String.class);
headers = response.getHeaders();
assertHeaders(headers, key, false, true);
assertEquals(TOO_MANY_REQUESTS, response.getStatusCode());
}
/**
* Post-process the Problem payload to add the message key for the front-end if needed
*/
@Override
public ResponseEntity<Problem> process(@Nullable ResponseEntity<Problem> entity, NativeWebRequest request) {
if (entity == null) {
return entity;
}
Problem problem = entity.getBody();
if (!(problem instanceof ConstraintViolationProblem || problem instanceof DefaultProblem)) {
return entity;
}
ProblemBuilder builder = Problem.builder()
.withType(Problem.DEFAULT_TYPE.equals(problem.getType()) ? ErrorConstants.DEFAULT_TYPE : problem.getType())
.withStatus(problem.getStatus())
.withTitle(problem.getTitle())
.with("path", request.getNativeRequest(HttpServletRequest.class).getRequestURI());
if (problem instanceof ConstraintViolationProblem) {
builder
.with("violations", ((ConstraintViolationProblem) problem).getViolations())
.with("message", ErrorConstants.ERR_VALIDATION);
} else {
builder
.withCause(((DefaultProblem) problem).getCause())
.withDetail(problem.getDetail())
.withInstance(problem.getInstance());
problem.getParameters().forEach(builder::with);
if (!problem.getParameters().containsKey("message") && problem.getStatus() != null) {
builder.with("message", "error.http." + problem.getStatus().getStatusCode());
}
}
return new ResponseEntity<>(builder.build(), entity.getHeaders(), entity.getStatusCode());
}
@Test
public void testNotExceedingCapacityRequest() {
ResponseEntity<String> response = this.restTemplate.getForEntity("/serviceA", String.class);
HttpHeaders headers = response.getHeaders();
assertHeaders(headers, "rate-limit-application_serviceA_127.0.0.1", false, false);
assertEquals(OK, response.getStatusCode());
}
/**
* Post-process the Problem payload to add the message key for the front-end if needed.
*/
@Override
public ResponseEntity<Problem> process(@Nullable ResponseEntity<Problem> entity, NativeWebRequest request) {
if (entity == null) {
return entity;
}
Problem problem = entity.getBody();
if (!(problem instanceof ConstraintViolationProblem || problem instanceof DefaultProblem)) {
return entity;
}
ProblemBuilder builder = Problem.builder()
.withType(Problem.DEFAULT_TYPE.equals(problem.getType()) ? ErrorConstants.DEFAULT_TYPE : problem.getType())
.withStatus(problem.getStatus())
.withTitle(problem.getTitle())
.with(PATH_KEY, request.getNativeRequest(HttpServletRequest.class).getRequestURI());
if (problem instanceof ConstraintViolationProblem) {
builder
.with(VIOLATIONS_KEY, ((ConstraintViolationProblem) problem).getViolations())
.with(MESSAGE_KEY, ErrorConstants.ERR_VALIDATION);
} else {
builder
.withCause(((DefaultProblem) problem).getCause())
.withDetail(problem.getDetail())
.withInstance(problem.getInstance());
problem.getParameters().forEach(builder::with);
if (!problem.getParameters().containsKey(MESSAGE_KEY) && problem.getStatus() != null) {
builder.with(MESSAGE_KEY, "error.http." + problem.getStatus().getStatusCode());
}
}
return new ResponseEntity<>(builder.build(), entity.getHeaders(), entity.getStatusCode());
}
/**
* Post-process the Problem payload to add the message key for the front-end if needed
*/
@Override
public ResponseEntity<Problem> process(@Nullable ResponseEntity<Problem> entity, NativeWebRequest request) {
if (entity == null) {
return entity;
}
Problem problem = entity.getBody();
if (!(problem instanceof ConstraintViolationProblem || problem instanceof DefaultProblem)) {
return entity;
}
ProblemBuilder builder = Problem.builder()
.withType(Problem.DEFAULT_TYPE.equals(problem.getType()) ? ErrorConstants.DEFAULT_TYPE : problem.getType())
.withStatus(problem.getStatus())
.withTitle(problem.getTitle())
.with("path", request.getNativeRequest(HttpServletRequest.class).getRequestURI());
if (problem instanceof ConstraintViolationProblem) {
builder
.with("violations", ((ConstraintViolationProblem) problem).getViolations())
.with("message", ErrorConstants.ERR_VALIDATION);
} else {
builder
.withCause(((DefaultProblem) problem).getCause())
.withDetail(problem.getDetail())
.withInstance(problem.getInstance());
problem.getParameters().forEach(builder::with);
if (!problem.getParameters().containsKey("message") && problem.getStatus() != null) {
builder.with("message", "error.http." + problem.getStatus().getStatusCode());
}
}
return new ResponseEntity<>(builder.build(), entity.getHeaders(), entity.getStatusCode());
}
@Test
public void whenResponseEntityConstructorAndMultipleHeadersRequest_thenObtainResponseWithCorrectHeaders() {
final String requestUrl = "/response-entity-contructor-multiple-headers";
ResponseEntity<String> response = template.getForEntity(SINGLE_BASE_URL + requestUrl, String.class);
HttpHeaders responseHeaders = response.getHeaders();
assertThat(responseHeaders).isNotEmpty();
assertThat(responseHeaders).containsEntry(SERVICE_SINGLE_RESPONSE_HEADER, Arrays.asList("Value-ResponseEntityConstructorAndHeaders"));
assertThat(responseHeaders).containsEntry("Accept", Arrays.asList(MediaType.APPLICATION_JSON.toString()));
}
public RestTemplateResponse(ResponseEntity<String> response) {
this.body = response.getBody();
this.status = response.getStatusCodeValue();
this.message = response.getStatusCode().getReasonPhrase();
this.headers = response.getHeaders();
}