Resolve URI to baseUrl in RestClient

Closes gh-32679
This commit is contained in:
Arjen Poutsma
2024-07-01 12:20:49 +02:00
committed by Arjen Poutsma
parent 98e89d8fba
commit 5864f57198
5 changed files with 87 additions and 2 deletions

View File

@@ -17,6 +17,7 @@
package org.springframework.web.client;
import java.lang.reflect.Field;
import java.net.URI;
import java.util.List;
import org.junit.jupiter.api.Test;
@@ -90,6 +91,18 @@ public class RestClientBuilderTests {
assertThat(fieldValue("uriBuilderFactory", defaultBuilder)).isNull();
}
@Test
void defaultUri() {
URI baseUrl = URI.create("https://example.org");
RestClient.Builder builder = RestClient.builder();
builder.baseUrl(baseUrl);
assertThat(builder).isInstanceOf(DefaultRestClientBuilder.class);
DefaultRestClientBuilder defaultBuilder = (DefaultRestClientBuilder) builder;
assertThat(fieldValue("baseUrl", defaultBuilder)).isEqualTo(baseUrl.toString());
}
@Nullable
private static Object fieldValue(String name, DefaultRestClientBuilder instance) {
try {

View File

@@ -21,6 +21,8 @@ import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.net.URI;
import java.net.URISyntaxException;
import java.nio.charset.StandardCharsets;
import java.util.List;
import java.util.Map;
@@ -923,6 +925,28 @@ class RestClientIntegrationTests {
expectRequest(request -> assertThat(request.getHeader("Accept")).isEqualTo(MediaType.TEXT_PLAIN_VALUE));
}
@ParameterizedRestClientTest
void relativeUri(ClientHttpRequestFactory requestFactory) throws URISyntaxException {
startServer(requestFactory);
prepareResponse(response -> response.setHeader("Content-Type", "text/plain")
.setBody("Hello Spring!"));
URI uri = new URI(null, null, "/foo bar", null);
String result = this.restClient
.get()
.uri(uri)
.accept(MediaType.TEXT_PLAIN)
.retrieve()
.body(String.class);
assertThat(result).isEqualTo("Hello Spring!");
expectRequestCount(1);
expectRequest(request -> assertThat(request.getPath()).isEqualTo("/foo%20bar"));
}
private void prepareResponse(Consumer<MockResponse> consumer) {
MockResponse response = new MockResponse();