Making API Calls with Custom SSL Certificates
import groovy.json.JsonSlurper
import groovy.json.JsonOutput
import javax.net.ssl.*
import java.security.cert.X509Certificate
import java.security.KeyStore
try {
// 1. Get certificate from Apinizer Manager
X509Certificate cert = environment_certificateMap.get("certificate-name")
if (cert == null) {
throw new Exception("Certificate not found: certificate-name")
}
// 2. Create KeyStore and add certificate
KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType())
keyStore.load(null, null)
keyStore.setCertificateEntry("domain.com", cert)
// 3. Create TrustManagerFactory
TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm())
tmf.init(keyStore)
// 4. Configure SSLContext securely
SSLContext sslContext = SSLContext.getInstance("TLS")
sslContext.init(null, tmf.getTrustManagers(), new java.security.SecureRandom())
// 5. Set default SSL Socket Factory
HttpsURLConnection.setDefaultSSLSocketFactory(sslContext.getSocketFactory())
// 6. Hostname verification (recommended for production)
HttpsURLConnection.setDefaultHostnameVerifier(HttpsURLConnection.getDefaultHostnameVerifier())
// 7. Make API call
String apiUrl = "https://your-api-endpoint.com/api/resource"
URL url = new URL(apiUrl)
HttpsURLConnection conn = (HttpsURLConnection) url.openConnection()
// Request settings
conn.setRequestMethod("GET") // or POST, PUT, DELETE
conn.setRequestProperty("Accept", "application/json")
conn.setRequestProperty("Content-Type", "application/json")
conn.setUseCaches(false)
// To add body for POST request:
// conn.setDoOutput(true)
// def requestBody = JsonOutput.toJson([key: "value"])
// conn.getOutputStream().write(requestBody.getBytes("UTF-8"))
// 8. Get response
def statusCode = conn.getResponseCode()
if (statusCode == 200) {
def responseText = conn.getInputStream().getText("UTF-8")
def jsonResponse = new JsonSlurper().parseText(responseText)
// Process response
requestHeaderMapToTargetAPI.put("status-code", statusCode)
requestHeaderMapToTargetAPI.put("response", jsonResponse)
} else {
def errorText = conn.getErrorStream()?.getText("UTF-8") ?: "No error message"
requestHeaderMapToTargetAPI.put("status-code", statusCode)
requestErrorMessageToTargetAPI = "API Error: ${errorText}"
}
conn.disconnect()
} catch (Exception e) {
requestErrorMessageToTargetAPI = "Error occurred: ${e.getMessage()}"
// For detailed error logging
// e.printStackTrace()
}
GROOVY