Sometimes this is useful for the diagnosis of configuration and network problems of ones Java application.
This is our single-class HTTP client example without the need for external dependencies:
HttpTest.java
import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManagerFactory;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.ProxySelector;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpRequest.BodyPublishers;
import java.net.http.HttpResponse;
import java.net.http.HttpResponse.BodyHandlers;
import java.security.KeyManagementException;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.UnrecoverableKeyException;
import java.security.cert.CertificateException;
import java.time.Duration;
import java.time.temporal.ChronoUnit;
public class HttpTest {
public static void main(String[] args)
throws URISyntaxException, NoSuchAlgorithmException, KeyManagementException, KeyStoreException, UnrecoverableKeyException, IOException, CertificateException {
String bodyPayload = """
ourpayload, json, xml, ...
""";
String keyStorePath = "/opt/keystore.jks";
String keyStorePassword = "ABCDEFG";
String proxyHost = "ourproxy.proxy";
String uriString = "https://some-service/api";
int proxyPort = 8080;
int timeoutInSeconds = 60;
KeyStore keyStore = KeyStore.getInstance("JKS");
keyStore.load(new FileInputStream(keyStorePath), keyStorePassword.toCharArray());
KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance("PKIX");
keyManagerFactory.init(keyStore, null);
TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance("PKIX"); // using same keystore for both
trustManagerFactory.init(keyStore);
SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(keyManagerFactory.getKeyManagers(), trustManagerFactory.getTrustManagers(), null);
HttpClient client = HttpClient.newBuilder()
.proxy(
ProxySelector.of(new InetSocketAddress(proxyHost, proxyPort)))
.sslContext(sslContext)
.build();
URI uri = new URI(uriString);
HttpRequest request = HttpRequest.newBuilder(uri)
.POST(BodyPublishers.ofString(bodyPayload))
.timeout(Duration.of(timeoutInSeconds, ChronoUnit.SECONDS))
.build();
System.out.printf("Sending POST request to %s, timeout: %ds%n", uri, timeoutInSeconds);
try {
HttpResponse response = client.send(request, BodyHandlers.ofString());
System.out.println("Response received...");
System.out.printf("\tResponse-Status: %d%n", response.statusCode());
System.out.printf("\tResponse-Body: %s%n", response.body());
System.out.println("-------------------------------------%n");
} catch (IOException e) {
System.err.printf("IOException caught: %s%n", e.getMessage());
e.printStackTrace(System.err);
} catch (InterruptedException e) {
System.err.printf("IOException caught: %s%n", e.getMessage());
e.printStackTrace(System.err);
}
}
}
One shot copy, paste, compile and run on a system for debugging …
cat << EOF > HttpTest.java && javac HttpTest.java && java HttpTest
<PASTE>
EOF