Skip to content

Commit 986ffc2

Browse files
sonalluxbclozel
authored andcommitted
Use full URI for URI template keyvalue with RestClient
Prior to this commit, `RestClient` would not use the full URI created by the uri handler as a template request attribute. This means that HTTP client observations would not contain the base URI in recorded observations as the uri template keyvalue. Closes gh-33928
1 parent b9cf03f commit 986ffc2

File tree

2 files changed

+24
-9
lines changed

2 files changed

+24
-9
lines changed

spring-web/src/main/java/org/springframework/web/client/DefaultRestClient.java

+6-3
Original file line numberDiff line numberDiff line change
@@ -313,19 +313,22 @@ public DefaultRequestBodyUriSpec(HttpMethod httpMethod) {
313313

314314
@Override
315315
public RequestBodySpec uri(String uriTemplate, Object... uriVariables) {
316-
attribute(URI_TEMPLATE_ATTRIBUTE, uriTemplate);
316+
UriBuilder uriBuilder = uriBuilderFactory.uriString(uriTemplate);
317+
attribute(URI_TEMPLATE_ATTRIBUTE, uriBuilder.toUriString());
317318
return uri(DefaultRestClient.this.uriBuilderFactory.expand(uriTemplate, uriVariables));
318319
}
319320

320321
@Override
321322
public RequestBodySpec uri(String uriTemplate, Map<String, ?> uriVariables) {
322-
attribute(URI_TEMPLATE_ATTRIBUTE, uriTemplate);
323+
UriBuilder uriBuilder = uriBuilderFactory.uriString(uriTemplate);
324+
attribute(URI_TEMPLATE_ATTRIBUTE, uriBuilder.toUriString());
323325
return uri(DefaultRestClient.this.uriBuilderFactory.expand(uriTemplate, uriVariables));
324326
}
325327

326328
@Override
327329
public RequestBodySpec uri(String uriTemplate, Function<UriBuilder, URI> uriFunction) {
328-
attribute(URI_TEMPLATE_ATTRIBUTE, uriTemplate);
330+
UriBuilder uriBuilder = uriBuilderFactory.uriString(uriTemplate);
331+
attribute(URI_TEMPLATE_ATTRIBUTE, uriBuilder.toUriString());
329332
return uri(uriFunction.apply(DefaultRestClient.this.uriBuilderFactory.uriString(uriTemplate)));
330333
}
331334

spring-web/src/test/java/org/springframework/web/client/RestClientObservationTests.java

+18-6
Original file line numberDiff line numberDiff line change
@@ -83,33 +83,45 @@ void setupEach() {
8383

8484
RestClient.Builder createBuilder() {
8585
return RestClient.builder()
86+
.baseUrl("https://example.com/base")
8687
.messageConverters(converters -> converters.add(0, this.converter))
8788
.requestFactory(this.requestFactory)
8889
.observationRegistry(this.observationRegistry);
8990
}
9091

9192
@Test
9293
void shouldContributeTemplateWhenUriVariables() throws Exception {
93-
mockSentRequest(GET, "https://example.com/hotels/42/bookings/21");
94+
mockSentRequest(GET, "https://example.com/base/hotels/42/bookings/21");
9495
mockResponseStatus(HttpStatus.OK);
9596

96-
client.get().uri("https://example.com/hotels/{hotel}/bookings/{booking}", "42", "21")
97+
client.get().uri("/hotels/{hotel}/bookings/{booking}", "42", "21")
9798
.retrieve().toBodilessEntity();
9899

99-
assertThatHttpObservation().hasLowCardinalityKeyValue("uri", "/hotels/{hotel}/bookings/{booking}");
100+
assertThatHttpObservation().hasLowCardinalityKeyValue("uri", "/base/hotels/{hotel}/bookings/{booking}");
100101
}
101102

102103
@Test
103104
void shouldContributeTemplateWhenMap() throws Exception {
104-
mockSentRequest(GET, "https://example.com/hotels/42/bookings/21");
105+
mockSentRequest(GET, "https://example.com/base/hotels/42/bookings/21");
105106
mockResponseStatus(HttpStatus.OK);
106107

107108
Map<String, String> vars = Map.of("hotel", "42", "booking", "21");
108109

109-
client.get().uri("https://example.com/hotels/{hotel}/bookings/{booking}", vars)
110+
client.get().uri("/hotels/{hotel}/bookings/{booking}", vars)
110111
.retrieve().toBodilessEntity();
111112

112-
assertThatHttpObservation().hasLowCardinalityKeyValue("uri", "/hotels/{hotel}/bookings/{booking}");
113+
assertThatHttpObservation().hasLowCardinalityKeyValue("uri", "/base/hotels/{hotel}/bookings/{booking}");
114+
}
115+
116+
@Test
117+
void shouldContributeTemplateWhenFunction() throws Exception {
118+
mockSentRequest(GET, "https://example.com/base/hotels/42/bookings/21");
119+
mockResponseStatus(HttpStatus.OK);
120+
121+
client.get().uri("/hotels/{hotel}/bookings/{booking}", builder -> builder.build("42", "21"))
122+
.retrieve().toBodilessEntity();
123+
124+
assertThatHttpObservation().hasLowCardinalityKeyValue("uri", "/base/hotels/{hotel}/bookings/{booking}");
113125
}
114126

115127
@Test

0 commit comments

Comments
 (0)