Support default headers with RestTemplateBuilder
Update `RestTemplateBuilder` so that it is easier to apply custom headers to the outgoing request. The update is particularly useful for setting the `User-Agent` header, for example so that a GitHub username can be used when calling `api.github.com`. See gh-17091
This commit is contained in:
committed by
Phillip Webb
parent
9b5cb4f9b8
commit
43b1a667ce
@@ -31,6 +31,7 @@ import org.springframework.boot.test.web.client.TestRestTemplate.HttpClientOptio
|
||||
import org.springframework.boot.web.client.RestTemplateBuilder;
|
||||
import org.springframework.core.ParameterizedTypeReference;
|
||||
import org.springframework.http.HttpEntity;
|
||||
import org.springframework.http.HttpHeaders;
|
||||
import org.springframework.http.HttpMethod;
|
||||
import org.springframework.http.HttpStatus;
|
||||
import org.springframework.http.RequestEntity;
|
||||
@@ -43,6 +44,7 @@ import org.springframework.mock.env.MockEnvironment;
|
||||
import org.springframework.mock.http.client.MockClientHttpRequest;
|
||||
import org.springframework.mock.http.client.MockClientHttpResponse;
|
||||
import org.springframework.test.util.ReflectionTestUtils;
|
||||
import org.springframework.util.Base64Utils;
|
||||
import org.springframework.util.ReflectionUtils;
|
||||
import org.springframework.util.ReflectionUtils.MethodCallback;
|
||||
import org.springframework.web.client.ResponseErrorHandler;
|
||||
@@ -97,7 +99,8 @@ class TestRestTemplateTests {
|
||||
RestTemplateBuilder builder = new RestTemplateBuilder().requestFactory(() -> customFactory);
|
||||
TestRestTemplate testRestTemplate = new TestRestTemplate(builder).withBasicAuth("test", "test");
|
||||
RestTemplate restTemplate = testRestTemplate.getRestTemplate();
|
||||
assertThat(restTemplate.getRequestFactory().getClass().getName()).contains("BasicAuth");
|
||||
assertThat(restTemplate.getRequestFactory().getClass().getName())
|
||||
.contains("HttpHeadersCustomizingClientHttpRequestFactory");
|
||||
Object requestFactory = ReflectionTestUtils.getField(restTemplate.getRequestFactory(), "requestFactory");
|
||||
assertThat(requestFactory).isEqualTo(customFactory).hasSameClassAs(customFactory);
|
||||
}
|
||||
@@ -125,10 +128,9 @@ class TestRestTemplateTests {
|
||||
}
|
||||
|
||||
@Test
|
||||
void authenticated() {
|
||||
RestTemplate restTemplate = new TestRestTemplate("user", "password").getRestTemplate();
|
||||
ClientHttpRequestFactory factory = restTemplate.getRequestFactory();
|
||||
assertThat(factory.getClass().getName()).contains("BasicAuthentication");
|
||||
void authenticated() throws Exception {
|
||||
TestRestTemplate restTemplate = new TestRestTemplate("user", "password");
|
||||
assertBasicAuthorizationCredentials(restTemplate, "user", "password");
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -201,11 +203,12 @@ class TestRestTemplateTests {
|
||||
}
|
||||
|
||||
@Test
|
||||
void withBasicAuthAddsBasicAuthClientFactoryWhenNotAlreadyPresent() {
|
||||
void withBasicAuthAddsBasicAuthClientFactoryWhenNotAlreadyPresent() throws Exception {
|
||||
TestRestTemplate original = new TestRestTemplate();
|
||||
TestRestTemplate basicAuth = original.withBasicAuth("user", "password");
|
||||
assertThat(getConverterClasses(original)).containsExactlyElementsOf(getConverterClasses(basicAuth));
|
||||
assertThat(basicAuth.getRestTemplate().getRequestFactory().getClass().getName()).contains("BasicAuth");
|
||||
assertThat(basicAuth.getRestTemplate().getRequestFactory().getClass().getName())
|
||||
.contains("HttpHeadersCustomizingClientHttpRequestFactory");
|
||||
assertThat(ReflectionTestUtils.getField(basicAuth.getRestTemplate().getRequestFactory(), "requestFactory"))
|
||||
.isInstanceOf(CustomHttpComponentsClientHttpRequestFactory.class);
|
||||
assertThat(basicAuth.getRestTemplate().getInterceptors()).isEmpty();
|
||||
@@ -213,11 +216,12 @@ class TestRestTemplateTests {
|
||||
}
|
||||
|
||||
@Test
|
||||
void withBasicAuthReplacesBasicAuthClientFactoryWhenAlreadyPresent() {
|
||||
void withBasicAuthReplacesBasicAuthClientFactoryWhenAlreadyPresent() throws Exception {
|
||||
TestRestTemplate original = new TestRestTemplate("foo", "bar").withBasicAuth("replace", "replace");
|
||||
TestRestTemplate basicAuth = original.withBasicAuth("user", "password");
|
||||
assertThat(getConverterClasses(basicAuth)).containsExactlyElementsOf(getConverterClasses(original));
|
||||
assertThat(basicAuth.getRestTemplate().getRequestFactory().getClass().getName()).contains("BasicAuth");
|
||||
assertThat(basicAuth.getRestTemplate().getRequestFactory().getClass().getName())
|
||||
.contains("HttpHeadersCustomizingClientHttpRequestFactory");
|
||||
assertThat(ReflectionTestUtils.getField(basicAuth.getRestTemplate().getRequestFactory(), "requestFactory"))
|
||||
.isInstanceOf(CustomHttpComponentsClientHttpRequestFactory.class);
|
||||
assertThat(basicAuth.getRestTemplate().getInterceptors()).isEmpty();
|
||||
@@ -342,11 +346,12 @@ class TestRestTemplateTests {
|
||||
}
|
||||
|
||||
private void assertBasicAuthorizationCredentials(TestRestTemplate testRestTemplate, String username,
|
||||
String password) {
|
||||
String password) throws Exception {
|
||||
ClientHttpRequestFactory requestFactory = testRestTemplate.getRestTemplate().getRequestFactory();
|
||||
Object authentication = ReflectionTestUtils.getField(requestFactory, "authentication");
|
||||
assertThat(authentication).hasFieldOrPropertyWithValue("username", username);
|
||||
assertThat(authentication).hasFieldOrPropertyWithValue("password", password);
|
||||
ClientHttpRequest request = requestFactory.createRequest(URI.create("http://localhost"), HttpMethod.POST);
|
||||
assertThat(request.getHeaders()).containsKeys(HttpHeaders.AUTHORIZATION);
|
||||
assertThat(request.getHeaders().get(HttpHeaders.AUTHORIZATION)).containsExactly(
|
||||
"Basic " + Base64Utils.encodeToString(String.format("%s:%s", username, password).getBytes()));
|
||||
|
||||
}
|
||||
|
||||
@@ -356,16 +361,4 @@ class TestRestTemplateTests {
|
||||
|
||||
}
|
||||
|
||||
static class TestClientHttpRequestFactory implements ClientHttpRequestFactory {
|
||||
|
||||
TestClientHttpRequestFactory(String value) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public ClientHttpRequest createRequest(URI uri, HttpMethod httpMethod) throws IOException {
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user