During development, we may want to log http request as cUrl command, so if the request failed, we can easily run it in cmd and check what's wrong, such as: are some header/params missing, ectc
Android already has CurlLogger.java, based on it, I wrote the following code in our spring application to log cUrl command in development mode.
CurlLoggerRequestInterceptor
Resource
Android CurlLogger.java
Android already has CurlLogger.java, based on it, I wrote the following code in our spring application to log cUrl command in development mode.
CurlLoggerRequestInterceptor
@Component
public class CurlLoggerRequestInterceptor implements ClientHttpRequestInterceptor {
private static final Logger logger = LoggerFactory.getLogger(CurlLoggerRequestInterceptor.class);
private static final Joiner JOINER = Joiner.on(",").skipNulls();
public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution)
throws IOException {
logger.info(toCurl(request, true));
return execution.execute(request, body);
}
private static String toCurl(HttpRequest request, boolean logAuthToken) throws IOException {
StringBuilder builder = new StringBuilder().append("curl ");
for (Entry<String, List<String>> entry : request.getHeaders().entrySet()) {
builder.append("--header \'");
if (!logAuthToken && (entry.getKey().equals("Authorization") || entry.getKey().equals("Cookie"))) {
builder.append(entry.getKey()).append(": ").append("${token}");
} else {
builder.append(entry.getKey()).append(": ").append(JOINER.join(entry.getValue()));
}
builder.append("\' ");
}
URI uri = request.getURI();
if (request instanceof HttpRequestWrapper) {
HttpRequest original = ((HttpRequestWrapper) request).getRequest();
uri = original.getURI();
}
builder.append("\'").append(uri).append("\'");
return builder.toString();
}
}
RestTemplateConfig@Configuration
public class RestTemplateConfig {
@Value("${enable.curl.log:false}")
private boolean enableCurlLog;
@Autowired
private ClientHttpRequestInterceptor curlLoggerRequestInterceptor;
@Bean
public RestTemplate restTemplate() {
RestTemplate template = new RestTemplate(clientFactory());
ArrayList<ClientHttpRequestInterceptor> interceptors = Lists.newArrayList();
if (enableCurlLog) {
interceptors.add(curlLoggerRequestInterceptor);
}
template.setInterceptors(interceptors);
return template;
}
}
Resource
Android CurlLogger.java