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