Alice52 / java-ocean

java-tutorial .We intend to explain Java knowledge in this repository.
MIT License
0 stars 0 forks source link

[http] RestTemplate usage #118

Open Alice52 opened 4 years ago

Alice52 commented 4 years ago

usage

  1. custom error handler: rest template default will throw xxException if response status is bot 200
@Component
public class RestTemplateErrorHandle extends DefaultResponseErrorHandler {
  @Override
  public void handleError(ClientHttpResponse response) {}
}
  1. if response is not json, rest template will throw RestClientException

// TODO: so need overwrite ResponseExtractor to get response firstly, but there are issue about InputStream read repeated.

@Component
public class RestTemplateProxy extends RestTemplate {

  @Override
  public <T> ResponseExtractor<ResponseEntity<T>> responseEntityExtractor(Type responseType) {
    return new NoExceptionRestTemplateResponseEntityExtractor<>(
        responseType, getMessageConverters());
  }
}
public class NoExceptionRestTemplateResponseEntityExtractor<T>
    implements ResponseExtractor<ResponseEntity<T>> {
  private static final Logger log =
      LoggerFactory.getLogger(NoExceptionRestTemplateResponseEntityExtractor.class);
  private final HttpMessageConverterExtractor<T> delegate;

  NoExceptionRestTemplateResponseEntityExtractor(
      Type responseType, List<HttpMessageConverter<?>> converters) {
    if (responseType != null && Void.class != responseType) {
      this.delegate = new HttpMessageConverterExtractor<>(responseType, converters);
    } else {
      this.delegate = null;
    }
  }

  @Override
  public ResponseEntity<T> extractData(ClientHttpResponse response) throws IOException {
    if (this.delegate != null) {
      T body = null;
      try {
        // TODO: read response firstly, then call super method

        /*
        InputStream inputStream = response.getBody();
        BufferedInputStream buffInputStream = new BufferedInputStream(inputStream);
        buffInputStream.mark(inputStream.available() + 1);
        String content = new String(ByteStreams.toByteArray(buffInputStream), Charsets.UTF_8);
        buffInputStream.reset();
        */
        body = this.delegate.extractData(response);
      } catch (RuntimeException e) {
        return new ResponseEntity(null, response.getHeaders(), response.getStatusCode());
      }
      return new ResponseEntity<>(body, response.getHeaders(), response.getStatusCode());
    } else {
      return new ResponseEntity<>(response.getHeaders(), response.getStatusCode());
    }
  }
}
Alice52 commented 3 years ago

solution

  1. try to copy this method and add wanted code please.