src/me/iyanuadelekan/paystackjava/core/ApiConnection.java
package me.iyanuadelekan.paystackjava.core;
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.JsonNode;
import com.mashape.unirest.http.Unirest;
import com.mashape.unirest.http.exceptions.UnirestException;
import org.json.JSONObject;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.util.HashMap;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.net.ssl.SSLContext;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import static org.apache.http.conn.ssl.SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER;
import org.apache.http.conn.ssl.SSLContexts;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
/**
* @author Iyanu Adelekan on 17/07/2016.
*/
public class ApiConnection {
private String url;
private String apiKey;
/**
* @param url - Paystack API URL
*/
public ApiConnection(String url) {
this.url = url;
Keys keys = new Keys();
try {
keys.initKeys();
} catch (FileNotFoundException e) {
System.out.print("Required Keys.json file could not be found.");
e.printStackTrace();
}
this.apiKey = keys.KEY_IN_USE;
this.enforceTlsV1point2();
}
private void enforceTlsV1point2() {
try {
SSLContext sslContext = SSLContexts.custom()
.useTLS()
.build();
SSLConnectionSocketFactory f = new SSLConnectionSocketFactory(
sslContext,
new String[]{"TLSv1.2"},
null,
BROWSER_COMPATIBLE_HOSTNAME_VERIFIER);
CloseableHttpClient httpClient = HttpClients.custom()
.setSSLSocketFactory(f)
.build();
Unirest.setHttpClient(httpClient);
} catch (NoSuchAlgorithmException ex) {
Logger.getLogger(ApiConnection.class.getName()).log(Level.SEVERE, null, ex);
} catch (KeyManagementException ex) {
Logger.getLogger(ApiConnection.class.getName()).log(Level.SEVERE, null, ex);
}
}
/**
* Connects to and queries Paystack API with POST
*
* @param query - APIQuery containing parameters to send
* @return - JSONObject containing API response
*/
public JSONObject connectAndQuery(ApiQuery query) {
try {
HttpResponse<JsonNode> queryForResponse = Unirest.post(url)
.header("Accept", "application/json")
.header("Authorization", "Bearer " + apiKey)
.fields(query.getParams())
.asJson();
return queryForResponse.getBody().getObject();
} catch (UnirestException e) {
e.printStackTrace();
}
return null;
}
/**
* Connects to and queries API with POST
*
* @param query - HashMap containing parameters to send
* @return - JSONObject containing API response
*/
public JSONObject connectAndQuery(HashMap<String, Object> query) {
try {
HttpResponse<JsonNode> queryForResponse = Unirest.post(url)
.header("Accept", "application/json")
.header("Authorization", "Bearer " + apiKey)
.fields(query)
.asJson();
return queryForResponse.getBody().getObject();
} catch (UnirestException e) {
e.printStackTrace();
}
return null;
}
/**
* Used to send a GET request to the Paystack API
*
* @return - JSONObject containing the API response
*/
public JSONObject connectAndQueryWithGet() {
try {
HttpResponse<JsonNode> queryForResponse = Unirest.get(url)
.header("Accept", "application/json")
.header("Authorization", "Bearer " + apiKey)
.asJson();
return queryForResponse.getBody().getObject();
} catch (UnirestException e) {
e.printStackTrace();
}
return null;
}
/**
* Used to send a GET request to the Paystack API
*
* @param query - APIQuery containing parameters to send
* @return - JSONObject containing API response
*/
public JSONObject connectAndQueryWithGet(ApiQuery query) {
try {
HttpResponse<JsonNode> queryForResponse = Unirest.get(url)
.header("Accept", "application/json")
.header("Authorization", "Bearer " + apiKey)
.queryString(query.getParams())
.asJson();
return queryForResponse.getBody().getObject();
} catch (UnirestException e) {
e.printStackTrace();
}
return null;
}
/**
* Used to send a GET request to the Paystack API
*
* @param query - HashMap containing parameters to send
* @return - JSONObject containing API response
*/
public JSONObject connectAndQueryWithGet(HashMap<String, Object> query) {
try {
HttpResponse<JsonNode> queryForResponse = Unirest.get(url)
.header("Accept", "application/json")
.header("Authorization", "Bearer " + apiKey)
.queryString(query)
.asJson();
return queryForResponse.getBody().getObject();
} catch (UnirestException e) {
e.printStackTrace();
}
return null;
}
/**
* Used to send a PUT request to the Paystack API
*
* @param query - APIQuery containing parameters to send
* @return - JSONObject containing API response
*/
public JSONObject connectAndQueryWithPut(ApiQuery query) {
try {
HttpResponse<JsonNode> queryForResponse = Unirest.put(url)
.header("Accept", "application/json")
.header("Authorization", "Bearer " + apiKey)
.fields(query.getParams())
.asJson();
return queryForResponse.getBody().getObject();
} catch (UnirestException e) {
e.printStackTrace();
}
return null;
}
/**
* Used to send a PUT request to the Paystack API
*
* @param query - HashMap containing parameters to send
* @return - JSONObject containing API response
*/
public JSONObject connectAndQueryWithPut(HashMap<String, Object> query) {
try {
HttpResponse<JsonNode> queryForResponse = Unirest.get(url)
.header("Accept", "application/json")
.header("Authorization", "Bearer " + apiKey)
.queryString(query)
.asJson();
return queryForResponse.getBody().getObject();
} catch (UnirestException e) {
e.printStackTrace();
}
return null;
}
/**
* Called to shut down the background event loop
*/
public static void shutDown() {
try {
Unirest.shutdown();
} catch (IOException e) {
e.printStackTrace();
}
}
}