|
|
|
@ -1,5 +1,5 @@ |
|
|
|
/* |
|
|
|
/* |
|
|
|
* Copyright 2002-2013 the original author or authors. |
|
|
|
* Copyright 2002-2014 the original author or authors. |
|
|
|
* |
|
|
|
* |
|
|
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
|
|
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
|
|
|
* you may not use this file except in compliance with the License. |
|
|
|
* you may not use this file except in compliance with the License. |
|
|
|
@ -88,8 +88,7 @@ public class AsyncRestTemplate extends AsyncHttpAccessor implements AsyncRestOpe |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
public AsyncRestTemplate(AsyncListenableTaskExecutor taskExecutor) { |
|
|
|
public AsyncRestTemplate(AsyncListenableTaskExecutor taskExecutor) { |
|
|
|
Assert.notNull(taskExecutor, "AsyncTaskExecutor must not be null"); |
|
|
|
Assert.notNull(taskExecutor, "AsyncTaskExecutor must not be null"); |
|
|
|
SimpleClientHttpRequestFactory requestFactory = |
|
|
|
SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory(); |
|
|
|
new SimpleClientHttpRequestFactory(); |
|
|
|
|
|
|
|
requestFactory.setTaskExecutor(taskExecutor); |
|
|
|
requestFactory.setTaskExecutor(taskExecutor); |
|
|
|
this.syncTemplate = new RestTemplate(requestFactory); |
|
|
|
this.syncTemplate = new RestTemplate(requestFactory); |
|
|
|
setAsyncRequestFactory(requestFactory); |
|
|
|
setAsyncRequestFactory(requestFactory); |
|
|
|
@ -114,8 +113,7 @@ public class AsyncRestTemplate extends AsyncHttpAccessor implements AsyncRestOpe |
|
|
|
* @param asyncRequestFactory the asynchronous request factory |
|
|
|
* @param asyncRequestFactory the asynchronous request factory |
|
|
|
* @param syncRequestFactory the synchronous request factory |
|
|
|
* @param syncRequestFactory the synchronous request factory |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
public AsyncRestTemplate(AsyncClientHttpRequestFactory asyncRequestFactory, |
|
|
|
public AsyncRestTemplate(AsyncClientHttpRequestFactory asyncRequestFactory, ClientHttpRequestFactory syncRequestFactory) { |
|
|
|
ClientHttpRequestFactory syncRequestFactory) { |
|
|
|
|
|
|
|
this(asyncRequestFactory, new RestTemplate(syncRequestFactory)); |
|
|
|
this(asyncRequestFactory, new RestTemplate(syncRequestFactory)); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@ -125,8 +123,7 @@ public class AsyncRestTemplate extends AsyncHttpAccessor implements AsyncRestOpe |
|
|
|
* @param requestFactory the asynchronous request factory to use |
|
|
|
* @param requestFactory the asynchronous request factory to use |
|
|
|
* @param restTemplate the synchronous template to use |
|
|
|
* @param restTemplate the synchronous template to use |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
public AsyncRestTemplate(AsyncClientHttpRequestFactory requestFactory, |
|
|
|
public AsyncRestTemplate(AsyncClientHttpRequestFactory requestFactory, RestTemplate restTemplate) { |
|
|
|
RestTemplate restTemplate) { |
|
|
|
|
|
|
|
Assert.notNull(restTemplate, "'restTemplate' must not be null"); |
|
|
|
Assert.notNull(restTemplate, "'restTemplate' must not be null"); |
|
|
|
this.syncTemplate = restTemplate; |
|
|
|
this.syncTemplate = restTemplate; |
|
|
|
setAsyncRequestFactory(requestFactory); |
|
|
|
setAsyncRequestFactory(requestFactory); |
|
|
|
@ -195,6 +192,7 @@ public class AsyncRestTemplate extends AsyncHttpAccessor implements AsyncRestOpe |
|
|
|
return execute(url, HttpMethod.GET, requestCallback, responseExtractor); |
|
|
|
return execute(url, HttpMethod.GET, requestCallback, responseExtractor); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// HEAD
|
|
|
|
// HEAD
|
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
@Override |
|
|
|
@ -218,30 +216,29 @@ public class AsyncRestTemplate extends AsyncHttpAccessor implements AsyncRestOpe |
|
|
|
// POST
|
|
|
|
// POST
|
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
@Override |
|
|
|
public ListenableFuture<URI> postForLocation(String url, HttpEntity<?> request, |
|
|
|
public ListenableFuture<URI> postForLocation(String url, HttpEntity<?> request, Object... uriVariables) |
|
|
|
Object... uriVariables) throws RestClientException { |
|
|
|
throws RestClientException { |
|
|
|
|
|
|
|
|
|
|
|
AsyncRequestCallback requestCallback = httpEntityCallback(request); |
|
|
|
AsyncRequestCallback requestCallback = httpEntityCallback(request); |
|
|
|
ResponseExtractor<HttpHeaders> headersExtractor = headersExtractor(); |
|
|
|
ResponseExtractor<HttpHeaders> headersExtractor = headersExtractor(); |
|
|
|
ListenableFuture<HttpHeaders> headersFuture = |
|
|
|
ListenableFuture<HttpHeaders> headersFuture = |
|
|
|
execute(url, HttpMethod.POST, requestCallback, headersExtractor, |
|
|
|
execute(url, HttpMethod.POST, requestCallback, headersExtractor, uriVariables); |
|
|
|
uriVariables); |
|
|
|
|
|
|
|
return extractLocationHeader(headersFuture); |
|
|
|
return extractLocationHeader(headersFuture); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
@Override |
|
|
|
public ListenableFuture<URI> postForLocation(String url, HttpEntity<?> request, |
|
|
|
public ListenableFuture<URI> postForLocation(String url, HttpEntity<?> request, Map<String, ?> uriVariables) |
|
|
|
Map<String, ?> uriVariables) throws RestClientException { |
|
|
|
throws RestClientException { |
|
|
|
|
|
|
|
|
|
|
|
AsyncRequestCallback requestCallback = httpEntityCallback(request); |
|
|
|
AsyncRequestCallback requestCallback = httpEntityCallback(request); |
|
|
|
ResponseExtractor<HttpHeaders> headersExtractor = headersExtractor(); |
|
|
|
ResponseExtractor<HttpHeaders> headersExtractor = headersExtractor(); |
|
|
|
ListenableFuture<HttpHeaders> headersFuture = |
|
|
|
ListenableFuture<HttpHeaders> headersFuture = |
|
|
|
execute(url, HttpMethod.POST, requestCallback, headersExtractor, |
|
|
|
execute(url, HttpMethod.POST, requestCallback, headersExtractor, uriVariables); |
|
|
|
uriVariables); |
|
|
|
|
|
|
|
return extractLocationHeader(headersFuture); |
|
|
|
return extractLocationHeader(headersFuture); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
@Override |
|
|
|
public ListenableFuture<URI> postForLocation(URI url, HttpEntity<?> request) |
|
|
|
public ListenableFuture<URI> postForLocation(URI url, HttpEntity<?> request) throws RestClientException { |
|
|
|
throws RestClientException { |
|
|
|
|
|
|
|
AsyncRequestCallback requestCallback = httpEntityCallback(request); |
|
|
|
AsyncRequestCallback requestCallback = httpEntityCallback(request); |
|
|
|
ResponseExtractor<HttpHeaders> headersExtractor = headersExtractor(); |
|
|
|
ResponseExtractor<HttpHeaders> headersExtractor = headersExtractor(); |
|
|
|
ListenableFuture<HttpHeaders> headersFuture = |
|
|
|
ListenableFuture<HttpHeaders> headersFuture = |
|
|
|
@ -251,7 +248,6 @@ public class AsyncRestTemplate extends AsyncHttpAccessor implements AsyncRestOpe |
|
|
|
|
|
|
|
|
|
|
|
private static ListenableFuture<URI> extractLocationHeader(final ListenableFuture<HttpHeaders> headersFuture) { |
|
|
|
private static ListenableFuture<URI> extractLocationHeader(final ListenableFuture<HttpHeaders> headersFuture) { |
|
|
|
return new ListenableFuture<URI>() { |
|
|
|
return new ListenableFuture<URI>() { |
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
@Override |
|
|
|
public void addCallback(final ListenableFutureCallback<? super URI> callback) { |
|
|
|
public void addCallback(final ListenableFutureCallback<? super URI> callback) { |
|
|
|
headersFuture.addCallback(new ListenableFutureCallback<HttpHeaders>() { |
|
|
|
headersFuture.addCallback(new ListenableFutureCallback<HttpHeaders>() { |
|
|
|
@ -259,14 +255,12 @@ public class AsyncRestTemplate extends AsyncHttpAccessor implements AsyncRestOpe |
|
|
|
public void onSuccess(HttpHeaders result) { |
|
|
|
public void onSuccess(HttpHeaders result) { |
|
|
|
callback.onSuccess(result.getLocation()); |
|
|
|
callback.onSuccess(result.getLocation()); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
@Override |
|
|
|
public void onFailure(Throwable t) { |
|
|
|
public void onFailure(Throwable ex) { |
|
|
|
callback.onFailure(t); |
|
|
|
callback.onFailure(ex); |
|
|
|
} |
|
|
|
} |
|
|
|
}); |
|
|
|
}); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
@Override |
|
|
|
public boolean cancel(boolean mayInterruptIfRunning) { |
|
|
|
public boolean cancel(boolean mayInterruptIfRunning) { |
|
|
|
return headersFuture.cancel(mayInterruptIfRunning); |
|
|
|
return headersFuture.cancel(mayInterruptIfRunning); |
|
|
|
@ -285,8 +279,7 @@ public class AsyncRestTemplate extends AsyncHttpAccessor implements AsyncRestOpe |
|
|
|
return headers.getLocation(); |
|
|
|
return headers.getLocation(); |
|
|
|
} |
|
|
|
} |
|
|
|
@Override |
|
|
|
@Override |
|
|
|
public URI get(long timeout, TimeUnit unit) |
|
|
|
public URI get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException { |
|
|
|
throws InterruptedException, ExecutionException, TimeoutException { |
|
|
|
|
|
|
|
HttpHeaders headers = headersFuture.get(timeout, unit); |
|
|
|
HttpHeaders headers = headersFuture.get(timeout, unit); |
|
|
|
return headers.getLocation(); |
|
|
|
return headers.getLocation(); |
|
|
|
} |
|
|
|
} |
|
|
|
@ -296,45 +289,41 @@ public class AsyncRestTemplate extends AsyncHttpAccessor implements AsyncRestOpe |
|
|
|
@Override |
|
|
|
@Override |
|
|
|
public <T> ListenableFuture<ResponseEntity<T>> postForEntity(String url, HttpEntity<?> request, |
|
|
|
public <T> ListenableFuture<ResponseEntity<T>> postForEntity(String url, HttpEntity<?> request, |
|
|
|
Class<T> responseType, Object... uriVariables) throws RestClientException { |
|
|
|
Class<T> responseType, Object... uriVariables) throws RestClientException { |
|
|
|
|
|
|
|
|
|
|
|
AsyncRequestCallback requestCallback = httpEntityCallback(request, responseType); |
|
|
|
AsyncRequestCallback requestCallback = httpEntityCallback(request, responseType); |
|
|
|
ResponseExtractor<ResponseEntity<T>> responseExtractor = |
|
|
|
ResponseExtractor<ResponseEntity<T>> responseExtractor = responseEntityExtractor(responseType); |
|
|
|
responseEntityExtractor(responseType); |
|
|
|
return execute(url, HttpMethod.POST, requestCallback, responseExtractor, uriVariables); |
|
|
|
return execute(url, HttpMethod.POST, requestCallback, responseExtractor, |
|
|
|
|
|
|
|
uriVariables); |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
@Override |
|
|
|
public <T> ListenableFuture<ResponseEntity<T>> postForEntity(String url, HttpEntity<?> request, |
|
|
|
public <T> ListenableFuture<ResponseEntity<T>> postForEntity(String url, HttpEntity<?> request, |
|
|
|
Class<T> responseType, Map<String, ?> uriVariables) |
|
|
|
Class<T> responseType, Map<String, ?> uriVariables) throws RestClientException { |
|
|
|
throws RestClientException { |
|
|
|
|
|
|
|
AsyncRequestCallback requestCallback = httpEntityCallback(request, responseType); |
|
|
|
AsyncRequestCallback requestCallback = httpEntityCallback(request, responseType); |
|
|
|
ResponseExtractor<ResponseEntity<T>> responseExtractor = |
|
|
|
ResponseExtractor<ResponseEntity<T>> responseExtractor = responseEntityExtractor(responseType); |
|
|
|
responseEntityExtractor(responseType); |
|
|
|
return execute(url, HttpMethod.POST, requestCallback, responseExtractor, uriVariables); |
|
|
|
return execute(url, HttpMethod.POST, requestCallback, responseExtractor, |
|
|
|
|
|
|
|
uriVariables); |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
@Override |
|
|
|
public <T> ListenableFuture<ResponseEntity<T>> postForEntity(URI url, HttpEntity<?> request, |
|
|
|
public <T> ListenableFuture<ResponseEntity<T>> postForEntity(URI url, HttpEntity<?> request, Class<T> responseType) |
|
|
|
Class<T> responseType) throws RestClientException { |
|
|
|
throws RestClientException { |
|
|
|
|
|
|
|
|
|
|
|
AsyncRequestCallback requestCallback = httpEntityCallback(request, responseType); |
|
|
|
AsyncRequestCallback requestCallback = httpEntityCallback(request, responseType); |
|
|
|
ResponseExtractor<ResponseEntity<T>> responseExtractor = |
|
|
|
ResponseExtractor<ResponseEntity<T>> responseExtractor = responseEntityExtractor(responseType); |
|
|
|
responseEntityExtractor(responseType); |
|
|
|
|
|
|
|
return execute(url, HttpMethod.POST, requestCallback, responseExtractor); |
|
|
|
return execute(url, HttpMethod.POST, requestCallback, responseExtractor); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// PUT
|
|
|
|
// PUT
|
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
@Override |
|
|
|
public ListenableFuture<?> put(String url, HttpEntity<?> request, Object... uriVariables) |
|
|
|
public ListenableFuture<?> put(String url, HttpEntity<?> request, Object... uriVariables) throws RestClientException { |
|
|
|
throws RestClientException { |
|
|
|
|
|
|
|
AsyncRequestCallback requestCallback = httpEntityCallback(request); |
|
|
|
AsyncRequestCallback requestCallback = httpEntityCallback(request); |
|
|
|
return execute(url, HttpMethod.PUT, requestCallback, null, uriVariables); |
|
|
|
return execute(url, HttpMethod.PUT, requestCallback, null, uriVariables); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
@Override |
|
|
|
public ListenableFuture<?> put(String url, HttpEntity<?> request, |
|
|
|
public ListenableFuture<?> put(String url, HttpEntity<?> request, Map<String, ?> uriVariables) throws RestClientException { |
|
|
|
Map<String, ?> uriVariables) throws RestClientException { |
|
|
|
|
|
|
|
AsyncRequestCallback requestCallback = httpEntityCallback(request); |
|
|
|
AsyncRequestCallback requestCallback = httpEntityCallback(request); |
|
|
|
return execute(url, HttpMethod.PUT, requestCallback, null, uriVariables); |
|
|
|
return execute(url, HttpMethod.PUT, requestCallback, null, uriVariables); |
|
|
|
} |
|
|
|
} |
|
|
|
@ -345,17 +334,16 @@ public class AsyncRestTemplate extends AsyncHttpAccessor implements AsyncRestOpe |
|
|
|
return execute(url, HttpMethod.PUT, requestCallback, null); |
|
|
|
return execute(url, HttpMethod.PUT, requestCallback, null); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// DELETE
|
|
|
|
// DELETE
|
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
@Override |
|
|
|
public ListenableFuture<?> delete(String url, Object... urlVariables) |
|
|
|
public ListenableFuture<?> delete(String url, Object... urlVariables) throws RestClientException { |
|
|
|
throws RestClientException { |
|
|
|
|
|
|
|
return execute(url, HttpMethod.DELETE, null, null, urlVariables); |
|
|
|
return execute(url, HttpMethod.DELETE, null, null, urlVariables); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
@Override |
|
|
|
public ListenableFuture<?> delete(String url, Map<String, ?> urlVariables) |
|
|
|
public ListenableFuture<?> delete(String url, Map<String, ?> urlVariables) throws RestClientException { |
|
|
|
throws RestClientException { |
|
|
|
|
|
|
|
return execute(url, HttpMethod.DELETE, null, null, urlVariables); |
|
|
|
return execute(url, HttpMethod.DELETE, null, null, urlVariables); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@ -364,6 +352,7 @@ public class AsyncRestTemplate extends AsyncHttpAccessor implements AsyncRestOpe |
|
|
|
return execute(url, HttpMethod.DELETE, null, null); |
|
|
|
return execute(url, HttpMethod.DELETE, null, null); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// OPTIONS
|
|
|
|
// OPTIONS
|
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
@Override |
|
|
|
@ -389,23 +378,19 @@ public class AsyncRestTemplate extends AsyncHttpAccessor implements AsyncRestOpe |
|
|
|
|
|
|
|
|
|
|
|
private static ListenableFuture<Set<HttpMethod>> extractAllowHeader(final ListenableFuture<HttpHeaders> headersFuture) { |
|
|
|
private static ListenableFuture<Set<HttpMethod>> extractAllowHeader(final ListenableFuture<HttpHeaders> headersFuture) { |
|
|
|
return new ListenableFuture<Set<HttpMethod>>() { |
|
|
|
return new ListenableFuture<Set<HttpMethod>>() { |
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
@Override |
|
|
|
public void addCallback( |
|
|
|
public void addCallback(final ListenableFutureCallback<? super Set<HttpMethod>> callback) { |
|
|
|
final ListenableFutureCallback<? super Set<HttpMethod>> callback) { |
|
|
|
|
|
|
|
headersFuture.addCallback(new ListenableFutureCallback<HttpHeaders>() { |
|
|
|
headersFuture.addCallback(new ListenableFutureCallback<HttpHeaders>() { |
|
|
|
@Override |
|
|
|
@Override |
|
|
|
public void onSuccess(HttpHeaders result) { |
|
|
|
public void onSuccess(HttpHeaders result) { |
|
|
|
callback.onSuccess(result.getAllow()); |
|
|
|
callback.onSuccess(result.getAllow()); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
@Override |
|
|
|
public void onFailure(Throwable t) { |
|
|
|
public void onFailure(Throwable ex) { |
|
|
|
callback.onFailure(t); |
|
|
|
callback.onFailure(ex); |
|
|
|
} |
|
|
|
} |
|
|
|
}); |
|
|
|
}); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
@Override |
|
|
|
public boolean cancel(boolean mayInterruptIfRunning) { |
|
|
|
public boolean cancel(boolean mayInterruptIfRunning) { |
|
|
|
return headersFuture.cancel(mayInterruptIfRunning); |
|
|
|
return headersFuture.cancel(mayInterruptIfRunning); |
|
|
|
@ -424,8 +409,7 @@ public class AsyncRestTemplate extends AsyncHttpAccessor implements AsyncRestOpe |
|
|
|
return headers.getAllow(); |
|
|
|
return headers.getAllow(); |
|
|
|
} |
|
|
|
} |
|
|
|
@Override |
|
|
|
@Override |
|
|
|
public Set<HttpMethod> get(long timeout, TimeUnit unit) |
|
|
|
public Set<HttpMethod> get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException { |
|
|
|
throws InterruptedException, ExecutionException, TimeoutException { |
|
|
|
|
|
|
|
HttpHeaders headers = headersFuture.get(timeout, unit); |
|
|
|
HttpHeaders headers = headersFuture.get(timeout, unit); |
|
|
|
return headers.getAllow(); |
|
|
|
return headers.getAllow(); |
|
|
|
} |
|
|
|
} |
|
|
|
@ -436,68 +420,59 @@ public class AsyncRestTemplate extends AsyncHttpAccessor implements AsyncRestOpe |
|
|
|
// exchange
|
|
|
|
// exchange
|
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
@Override |
|
|
|
public <T> ListenableFuture<ResponseEntity<T>> exchange(String url, HttpMethod method, |
|
|
|
public <T> ListenableFuture<ResponseEntity<T>> exchange(String url, HttpMethod method, HttpEntity<?> requestEntity, |
|
|
|
HttpEntity<?> requestEntity, Class<T> responseType, Object... uriVariables) |
|
|
|
Class<T> responseType, Object... uriVariables) throws RestClientException { |
|
|
|
throws RestClientException { |
|
|
|
|
|
|
|
AsyncRequestCallback requestCallback = |
|
|
|
AsyncRequestCallback requestCallback = httpEntityCallback(requestEntity, responseType); |
|
|
|
httpEntityCallback(requestEntity, responseType); |
|
|
|
ResponseExtractor<ResponseEntity<T>> responseExtractor = responseEntityExtractor(responseType); |
|
|
|
ResponseExtractor<ResponseEntity<T>> responseExtractor = |
|
|
|
|
|
|
|
responseEntityExtractor(responseType); |
|
|
|
|
|
|
|
return execute(url, method, requestCallback, responseExtractor, uriVariables); |
|
|
|
return execute(url, method, requestCallback, responseExtractor, uriVariables); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
@Override |
|
|
|
public <T> ListenableFuture<ResponseEntity<T>> exchange(String url, HttpMethod method, |
|
|
|
public <T> ListenableFuture<ResponseEntity<T>> exchange(String url, HttpMethod method, HttpEntity<?> requestEntity, |
|
|
|
HttpEntity<?> requestEntity, Class<T> responseType, |
|
|
|
Class<T> responseType, Map<String, ?> uriVariables) throws RestClientException { |
|
|
|
Map<String, ?> uriVariables) throws RestClientException { |
|
|
|
|
|
|
|
AsyncRequestCallback requestCallback = |
|
|
|
AsyncRequestCallback requestCallback = httpEntityCallback(requestEntity, responseType); |
|
|
|
httpEntityCallback(requestEntity, responseType); |
|
|
|
ResponseExtractor<ResponseEntity<T>> responseExtractor = responseEntityExtractor(responseType); |
|
|
|
ResponseExtractor<ResponseEntity<T>> responseExtractor = |
|
|
|
|
|
|
|
responseEntityExtractor(responseType); |
|
|
|
|
|
|
|
return execute(url, method, requestCallback, responseExtractor, uriVariables); |
|
|
|
return execute(url, method, requestCallback, responseExtractor, uriVariables); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
@Override |
|
|
|
public <T> ListenableFuture<ResponseEntity<T>> exchange(URI url, HttpMethod method, |
|
|
|
public <T> ListenableFuture<ResponseEntity<T>> exchange(URI url, HttpMethod method, HttpEntity<?> requestEntity, |
|
|
|
HttpEntity<?> requestEntity, Class<T> responseType) |
|
|
|
Class<T> responseType) throws RestClientException { |
|
|
|
throws RestClientException { |
|
|
|
|
|
|
|
AsyncRequestCallback requestCallback = |
|
|
|
AsyncRequestCallback requestCallback = httpEntityCallback(requestEntity, responseType); |
|
|
|
httpEntityCallback(requestEntity, responseType); |
|
|
|
ResponseExtractor<ResponseEntity<T>> responseExtractor = responseEntityExtractor(responseType); |
|
|
|
ResponseExtractor<ResponseEntity<T>> responseExtractor = |
|
|
|
|
|
|
|
responseEntityExtractor(responseType); |
|
|
|
|
|
|
|
return execute(url, method, requestCallback, responseExtractor); |
|
|
|
return execute(url, method, requestCallback, responseExtractor); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
@Override |
|
|
|
public <T> ListenableFuture<ResponseEntity<T>> exchange(String url, HttpMethod method, |
|
|
|
public <T> ListenableFuture<ResponseEntity<T>> exchange(String url, HttpMethod method, HttpEntity<?> requestEntity, |
|
|
|
HttpEntity<?> requestEntity, ParameterizedTypeReference<T> responseType, |
|
|
|
ParameterizedTypeReference<T> responseType, Object... uriVariables) throws RestClientException { |
|
|
|
Object... uriVariables) throws RestClientException { |
|
|
|
|
|
|
|
Type type = responseType.getType(); |
|
|
|
Type type = responseType.getType(); |
|
|
|
AsyncRequestCallback requestCallback = httpEntityCallback(requestEntity, type); |
|
|
|
AsyncRequestCallback requestCallback = httpEntityCallback(requestEntity, type); |
|
|
|
ResponseExtractor<ResponseEntity<T>> responseExtractor = |
|
|
|
ResponseExtractor<ResponseEntity<T>> responseExtractor = responseEntityExtractor(type); |
|
|
|
responseEntityExtractor(type); |
|
|
|
|
|
|
|
return execute(url, method, requestCallback, responseExtractor, uriVariables); |
|
|
|
return execute(url, method, requestCallback, responseExtractor, uriVariables); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
@Override |
|
|
|
public <T> ListenableFuture<ResponseEntity<T>> exchange(String url, HttpMethod method, |
|
|
|
public <T> ListenableFuture<ResponseEntity<T>> exchange(String url, HttpMethod method, HttpEntity<?> requestEntity, |
|
|
|
HttpEntity<?> requestEntity, ParameterizedTypeReference<T> responseType, |
|
|
|
ParameterizedTypeReference<T> responseType, Map<String, ?> uriVariables) throws RestClientException { |
|
|
|
Map<String, ?> uriVariables) throws RestClientException { |
|
|
|
|
|
|
|
Type type = responseType.getType(); |
|
|
|
Type type = responseType.getType(); |
|
|
|
AsyncRequestCallback requestCallback = httpEntityCallback(requestEntity, type); |
|
|
|
AsyncRequestCallback requestCallback = httpEntityCallback(requestEntity, type); |
|
|
|
ResponseExtractor<ResponseEntity<T>> responseExtractor = |
|
|
|
ResponseExtractor<ResponseEntity<T>> responseExtractor = responseEntityExtractor(type); |
|
|
|
responseEntityExtractor(type); |
|
|
|
|
|
|
|
return execute(url, method, requestCallback, responseExtractor, uriVariables); |
|
|
|
return execute(url, method, requestCallback, responseExtractor, uriVariables); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
@Override |
|
|
|
public <T> ListenableFuture<ResponseEntity<T>> exchange(URI url, HttpMethod method, |
|
|
|
public <T> ListenableFuture<ResponseEntity<T>> exchange(URI url, HttpMethod method, HttpEntity<?> requestEntity, |
|
|
|
HttpEntity<?> requestEntity, ParameterizedTypeReference<T> responseType) |
|
|
|
ParameterizedTypeReference<T> responseType) throws RestClientException { |
|
|
|
throws RestClientException { |
|
|
|
|
|
|
|
Type type = responseType.getType(); |
|
|
|
Type type = responseType.getType(); |
|
|
|
AsyncRequestCallback requestCallback = httpEntityCallback(requestEntity, type); |
|
|
|
AsyncRequestCallback requestCallback = httpEntityCallback(requestEntity, type); |
|
|
|
ResponseExtractor<ResponseEntity<T>> responseExtractor = |
|
|
|
ResponseExtractor<ResponseEntity<T>> responseExtractor = responseEntityExtractor(type); |
|
|
|
responseEntityExtractor(type); |
|
|
|
|
|
|
|
return execute(url, method, requestCallback, responseExtractor); |
|
|
|
return execute(url, method, requestCallback, responseExtractor); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@ -505,27 +480,24 @@ public class AsyncRestTemplate extends AsyncHttpAccessor implements AsyncRestOpe |
|
|
|
// general execution
|
|
|
|
// general execution
|
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
@Override |
|
|
|
public <T> ListenableFuture<T> execute(String url, HttpMethod method, |
|
|
|
public <T> ListenableFuture<T> execute(String url, HttpMethod method, AsyncRequestCallback requestCallback, |
|
|
|
AsyncRequestCallback requestCallback, ResponseExtractor<T> responseExtractor, |
|
|
|
ResponseExtractor<T> responseExtractor, Object... urlVariables) throws RestClientException { |
|
|
|
Object... urlVariables) throws RestClientException { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
URI expanded = new UriTemplate(url).expand(urlVariables); |
|
|
|
URI expanded = new UriTemplate(url).expand(urlVariables); |
|
|
|
return doExecute(expanded, method, requestCallback, responseExtractor); |
|
|
|
return doExecute(expanded, method, requestCallback, responseExtractor); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
@Override |
|
|
|
public <T> ListenableFuture<T> execute(String url, HttpMethod method, |
|
|
|
public <T> ListenableFuture<T> execute(String url, HttpMethod method, AsyncRequestCallback requestCallback, |
|
|
|
AsyncRequestCallback requestCallback, ResponseExtractor<T> responseExtractor, |
|
|
|
ResponseExtractor<T> responseExtractor, Map<String, ?> urlVariables) throws RestClientException { |
|
|
|
Map<String, ?> urlVariables) throws RestClientException { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
URI expanded = new UriTemplate(url).expand(urlVariables); |
|
|
|
URI expanded = new UriTemplate(url).expand(urlVariables); |
|
|
|
return doExecute(expanded, method, requestCallback, responseExtractor); |
|
|
|
return doExecute(expanded, method, requestCallback, responseExtractor); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
@Override |
|
|
|
public <T> ListenableFuture<T> execute(URI url, HttpMethod method, |
|
|
|
public <T> ListenableFuture<T> execute(URI url, HttpMethod method, AsyncRequestCallback requestCallback, |
|
|
|
AsyncRequestCallback requestCallback, ResponseExtractor<T> responseExtractor) |
|
|
|
ResponseExtractor<T> responseExtractor) throws RestClientException { |
|
|
|
throws RestClientException { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return doExecute(url, method, requestCallback, responseExtractor); |
|
|
|
return doExecute(url, method, requestCallback, responseExtractor); |
|
|
|
} |
|
|
|
} |
|
|
|
@ -553,8 +525,7 @@ public class AsyncRestTemplate extends AsyncHttpAccessor implements AsyncRestOpe |
|
|
|
requestCallback.doWithRequest(request); |
|
|
|
requestCallback.doWithRequest(request); |
|
|
|
} |
|
|
|
} |
|
|
|
ListenableFuture<ClientHttpResponse> responseFuture = request.executeAsync(); |
|
|
|
ListenableFuture<ClientHttpResponse> responseFuture = request.executeAsync(); |
|
|
|
return new ResponseExtractorFuture<T>(method, url, responseFuture, |
|
|
|
return new ResponseExtractorFuture<T>(method, url, responseFuture, responseExtractor); |
|
|
|
responseExtractor); |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
catch (IOException ex) { |
|
|
|
catch (IOException ex) { |
|
|
|
throw new ResourceAccessException("I/O error on " + method.name() + |
|
|
|
throw new ResourceAccessException("I/O error on " + method.name() + |
|
|
|
@ -565,9 +536,8 @@ public class AsyncRestTemplate extends AsyncHttpAccessor implements AsyncRestOpe |
|
|
|
private void logResponseStatus(HttpMethod method, URI url, ClientHttpResponse response) { |
|
|
|
private void logResponseStatus(HttpMethod method, URI url, ClientHttpResponse response) { |
|
|
|
if (logger.isDebugEnabled()) { |
|
|
|
if (logger.isDebugEnabled()) { |
|
|
|
try { |
|
|
|
try { |
|
|
|
logger.debug("Async " + method.name() + " request for \"" + url + |
|
|
|
logger.debug("Async " + method.name() + " request for \"" + url + "\" resulted in " + |
|
|
|
"\" resulted in " + response.getStatusCode() + " (" + |
|
|
|
response.getStatusCode() + " (" + response.getStatusText() + ")"); |
|
|
|
response.getStatusText() + ")"); |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
catch (IOException ex) { |
|
|
|
catch (IOException ex) { |
|
|
|
// ignore
|
|
|
|
// ignore
|
|
|
|
@ -578,9 +548,8 @@ public class AsyncRestTemplate extends AsyncHttpAccessor implements AsyncRestOpe |
|
|
|
private void handleResponseError(HttpMethod method, URI url, ClientHttpResponse response) throws IOException { |
|
|
|
private void handleResponseError(HttpMethod method, URI url, ClientHttpResponse response) throws IOException { |
|
|
|
if (logger.isWarnEnabled()) { |
|
|
|
if (logger.isWarnEnabled()) { |
|
|
|
try { |
|
|
|
try { |
|
|
|
logger.warn("Async " + method.name() + " request for \"" + url + |
|
|
|
logger.warn("Async " + method.name() + " request for \"" + url + "\" resulted in " + |
|
|
|
"\" resulted in " + response.getStatusCode() + " (" + |
|
|
|
response.getStatusCode() + " (" + response.getStatusText() + "); invoking error handler"); |
|
|
|
response.getStatusText() + "); invoking error handler"); |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
catch (IOException ex) { |
|
|
|
catch (IOException ex) { |
|
|
|
// ignore
|
|
|
|
// ignore
|
|
|
|
@ -628,12 +597,12 @@ public class AsyncRestTemplate extends AsyncHttpAccessor implements AsyncRestOpe |
|
|
|
return this.syncTemplate.headersExtractor(); |
|
|
|
return this.syncTemplate.headersExtractor(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
/** |
|
|
|
* Future returned from |
|
|
|
* Future returned from |
|
|
|
* {@link #doExecute(URI, HttpMethod, AsyncRequestCallback, ResponseExtractor)} |
|
|
|
* {@link #doExecute(URI, HttpMethod, AsyncRequestCallback, ResponseExtractor)} |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
private class ResponseExtractorFuture<T> |
|
|
|
private class ResponseExtractorFuture<T> extends ListenableFutureAdapter<T, ClientHttpResponse> { |
|
|
|
extends ListenableFutureAdapter<T, ClientHttpResponse> { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private final HttpMethod method; |
|
|
|
private final HttpMethod method; |
|
|
|
|
|
|
|
|
|
|
|
@ -642,8 +611,7 @@ public class AsyncRestTemplate extends AsyncHttpAccessor implements AsyncRestOpe |
|
|
|
private final ResponseExtractor<T> responseExtractor; |
|
|
|
private final ResponseExtractor<T> responseExtractor; |
|
|
|
|
|
|
|
|
|
|
|
public ResponseExtractorFuture(HttpMethod method, URI url, |
|
|
|
public ResponseExtractorFuture(HttpMethod method, URI url, |
|
|
|
ListenableFuture<ClientHttpResponse> clientHttpResponseFuture, |
|
|
|
ListenableFuture<ClientHttpResponse> clientHttpResponseFuture, ResponseExtractor<T> responseExtractor) { |
|
|
|
ResponseExtractor<T> responseExtractor) { |
|
|
|
|
|
|
|
super(clientHttpResponseFuture); |
|
|
|
super(clientHttpResponseFuture); |
|
|
|
this.method = method; |
|
|
|
this.method = method; |
|
|
|
this.url = url; |
|
|
|
this.url = url; |
|
|
|
@ -672,12 +640,11 @@ public class AsyncRestTemplate extends AsyncHttpAccessor implements AsyncRestOpe |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
protected T convertResponse(ClientHttpResponse response) throws IOException { |
|
|
|
protected T convertResponse(ClientHttpResponse response) throws IOException { |
|
|
|
return responseExtractor != null ? responseExtractor.extractData(response) : |
|
|
|
return (this.responseExtractor != null ? this.responseExtractor.extractData(response) : null); |
|
|
|
null; |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
/** |
|
|
|
* Adapts a {@link RequestCallback} to the {@link AsyncRequestCallback} interface. |
|
|
|
* Adapts a {@link RequestCallback} to the {@link AsyncRequestCallback} interface. |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
|