From e7b100ed8570c941eb9f36daecd9f9035b3402b8 Mon Sep 17 00:00:00 2001 From: a-panizza_globant Date: Thu, 20 Feb 2025 10:35:08 -0300 Subject: [PATCH 1/3] - Add Header paramter methods for API Objects. --- .../com/genexus/internet/GXRestAPIClient.java | 74 +++++++++++++++++++ 1 file changed, 74 insertions(+) diff --git a/java/src/main/java/com/genexus/internet/GXRestAPIClient.java b/java/src/main/java/com/genexus/internet/GXRestAPIClient.java index de4e50f25..0d8effa23 100644 --- a/java/src/main/java/com/genexus/internet/GXRestAPIClient.java +++ b/java/src/main/java/com/genexus/internet/GXRestAPIClient.java @@ -39,6 +39,7 @@ public class GXRestAPIClient { private JSONObject jsonResponse; private HashMap queryVars = new HashMap(); private HashMap bodyVars = new HashMap(); + private HashMap headerVars = new HashMap(); private HashMap responseData = new HashMap(); static final String DATE_FMT = "yyyy-MM-dd"; @@ -183,6 +184,71 @@ private String quoteString(String value) { return "\"" + value + "\""; } + /// Add Header parameters + + public void addHeaderVar(String varName, GXBaseCollection varValue) { + if ( varValue != null) { + headerVars.put(varName, varValue.toJSonString(false)); + } + } + + public void addHeaderVar(String varName, GXXMLSerializable varValue) { + if ( varValue != null) { + headerVars.put(varName, varValue.toJSonString(false)); + } + } + + public void addHeaderVar(String varName, String varValue) { + headerVars.put( varName, quoteString(varValue)); + } + + public void addHeaderVar(String varName, double varValue) { + headerVars.put(varName, quoteString(Double.toString(varValue))); + } + + public void addHeaderVar(String varName, Date varValue) { + SimpleDateFormat df = new SimpleDateFormat(DATE_FMT); + headerVars.put(varName, quoteString(df.format(varValue))); + } + + public void addHeaderVar(String varName, Date varValue, boolean hasMilliseconds) { + String fmt = DATETIME_FMT; + if (hasMilliseconds) + fmt = DATETIME_FMT_MS; + SimpleDateFormat df = new SimpleDateFormat(fmt); + headerVars.put( varName, quoteString(df.format(varValue))); + } + + public void addHeaderVar(String varName, short varValue) { + headerVars.put( varName, Short.toString(varValue)); + } + + public void addHeaderVar(String varName, int varValue) { + headerVars.put( varName, Integer.toString(varValue)); + } + + public void addHeaderVar(String varName, long varValue) { + headerVars.put( varName, Long.toString(varValue)); + } + + public void addHeaderVar(String varName, Boolean varValue) { + headerVars.put( varName, varValue.toString()); + } + + public void addHeaderVar(String varName, BigDecimal varValue) { + headerVars.put( varName, varValue.toString()); + } + + public void addHeaderVar(String varName, java.util.UUID varValue) { + headerVars.put( varName, quoteString(varValue.toString())); + } + + public void addHeaderVar(String varName, IGxJSONSerializable varValue) { + headerVars.put( varName, quoteString(varValue.toJSonString())); + } + + /// + public void addBodyVar(String varName, GXBaseCollection varValue) { if ( varValue != null) { bodyVars.put(varName, varValue.toJSonString(false)); @@ -411,6 +477,7 @@ public GXBaseCollection getBodyObjCollection(St fillCollection(varName, elementClass, col); return col; } + private void fillCollection(String varName, Class elementClass, GXBaseCollection col) { JSONArray jsonarr = new JSONArray(); try { @@ -508,6 +575,13 @@ public void RestExecute() { if (location.getAuthenticationMethod() == 4 && location.getAccessToken() != null && ! location.getAccessToken().trim().isEmpty()) { httpClient.addHeader("Authorization", location.getAccessToken()); } + if (headerVars.size() > 0) { + separator = ""; + for( Map.Entry entry : headerVars.entrySet()) { + httpClient.addHeader(entry.getKey(), entry.getValue()); + } + } + headerVars.clear(); String serviceuri = ((location.getSecure() > 0) ? "https" : "http") + "://" + location.getHost(); serviceuri += (location.getPort() != 80) ? ":" + Integer.toString(location.getPort()): ""; serviceuri += "/" + location.getBaseURL() + "/" + location.getResourceName(); From ab04725f7fbce62abb64a18e60a8714af1601a9f Mon Sep 17 00:00:00 2001 From: a-panizza_globant Date: Thu, 20 Feb 2025 19:37:32 -0300 Subject: [PATCH 2/3] - Added enum for Date Format - Fixed issues raised in review --- .../com/genexus/internet/GXRestAPIClient.java | 135 +++++++++--------- 1 file changed, 71 insertions(+), 64 deletions(-) diff --git a/java/src/main/java/com/genexus/internet/GXRestAPIClient.java b/java/src/main/java/com/genexus/internet/GXRestAPIClient.java index c93a816df..c71be6c12 100644 --- a/java/src/main/java/com/genexus/internet/GXRestAPIClient.java +++ b/java/src/main/java/com/genexus/internet/GXRestAPIClient.java @@ -9,9 +9,7 @@ import java.text.ParseException; import org.json.JSONArray; -import com.genexus.internet.IGxJSONAble; import com.genexus.xml.GXXMLSerializable; -import com.genexus.internet.IGxJSONSerializable; import com.genexus.common.interfaces.SpecificImplementation; import com.genexus.*; import com.genexus.diagnostics.core.ILogger; @@ -32,18 +30,15 @@ public class GXRestAPIClient { private String responseMessage; private String contentType = "application/json; charset=utf-8"; - private String queryString = ""; - private String bodyString = ""; + static final String CONTENT_TYPE_LABEL = "Content-Type"; + static final String AUTHORIZTION_LABEL = "Authorization"; private JSONObject jsonResponse; private HashMap queryVars = new HashMap(); private HashMap bodyVars = new HashMap(); private HashMap headerVars = new HashMap(); - private HashMap responseData = new HashMap(); - static final String DATE_FMT = "yyyy-MM-dd"; - static final String DATETIME_FMT = "yyyy-MM-dd'T'HH:mm:ss"; - static final String DATETIME_FMT_MS = "yyyy-MM-dd'T'HH:mm:ss.SSS"; + static final String DATE_NULL = "0000-00-00"; static final String DATETIME_NULL = "0000-00-00T00:00:00"; @@ -55,6 +50,40 @@ public class GXRestAPIClient { static final String RESPONSE_ERROR_MSG = "Invalid response"; static final String PARSING_ERROR_MSG = "Error parsing response"; static final String DESERIALIZING_ERROR_MSG = "Error serializing/deserializing object"; + + public enum DateFormat { + + DATE_FMT(1, "yyyy-MM-dd"), + DATETIME_FMT(3, "yyyy-MM-dd'T'HH:mm:ss"), + DATETIME_FMT_MS(4, "yyyy-MM-dd'T'HH:mm:ss.SSS"); + + private final int fmtId; + private final String fmtString; + + DateFormat(int fmtId, String fmtString) { + this.fmtId = fmtId; + this.fmtString = fmtString; + } + + public int getId() { + return fmtId; + } + + public String getFormat() { + return fmtString; + } + + public static DateFormat fromId(int fmtId) { + for (DateFormat format : DateFormat.values()) { + if (format.getId() == fmtId) { + return format; + } + } + throw new IllegalArgumentException("Unknown error code: " + fmtId); + } + } + + public GXRestAPIClient() { responseCode = 0; @@ -152,16 +181,11 @@ public void addQueryVar(String varName, double varValue) { queryVars.put(varName, Double.toString(varValue)); } - public void addQueryVar(String varName, Date varValue) { - SimpleDateFormat df = new SimpleDateFormat(DATE_FMT); - queryVars.put(varName, df.format(varValue)); - } + public void addQueryVar(String varName, Date varValue, int fmtId) { + DateFormat fmt = DateFormat.fromId(fmtId); + String fmtString = fmt.getFormat(); - public void addQueryVar(String varName, Date varValue, boolean hasMilliseconds) { - String fmt = DATETIME_FMT; - if (hasMilliseconds) - fmt = DATETIME_FMT_MS; - SimpleDateFormat df = new SimpleDateFormat(fmt); + SimpleDateFormat df = new SimpleDateFormat(fmtString); queryVars.put(varName, df.format(varValue)); } @@ -213,17 +237,12 @@ public void addHeaderVar(String varName, double varValue) { headerVars.put(varName, quoteString(Double.toString(varValue))); } - public void addHeaderVar(String varName, Date varValue) { - SimpleDateFormat df = new SimpleDateFormat(DATE_FMT); - headerVars.put(varName, quoteString(df.format(varValue))); - } + public void addHeaderVar(String varName, Date varValue, int fmtId) { + DateFormat fmt = DateFormat.fromId(fmtId); + String fmtString = fmt.getFormat(); - public void addHeaderVar(String varName, Date varValue, boolean hasMilliseconds) { - String fmt = DATETIME_FMT; - if (hasMilliseconds) - fmt = DATETIME_FMT_MS; - SimpleDateFormat df = new SimpleDateFormat(fmt); - headerVars.put( varName, quoteString(df.format(varValue))); + SimpleDateFormat df = new SimpleDateFormat(fmtString); + headerVars.put(varName, df.format(varValue)); } public void addHeaderVar(String varName, short varValue) { @@ -271,21 +290,11 @@ public void addBodyVar(String varName, GXXMLSerializable varValue) { public void addBodyVar(String varName, String varValue) { bodyVars.put( varName, quoteString(varValue)); } - - public void addBodyVar(String varName, double varValue) { - bodyVars.put(varName, quoteString(Double.toString(varValue))); - } - - public void addBodyVar(String varName, Date varValue) { - SimpleDateFormat df = new SimpleDateFormat(DATE_FMT); - bodyVars.put(varName, quoteString(df.format(varValue))); - } - - public void addBodyVar(String varName, Date varValue, boolean hasMilliseconds) { - String fmt = DATETIME_FMT; - if (hasMilliseconds) - fmt = DATETIME_FMT_MS; - SimpleDateFormat df = new SimpleDateFormat(fmt); + + public void addBodyVar(String varName, Date varValue, int fmtId) { + DateFormat fmt = DateFormat.fromId(fmtId); + String fmtString = fmt.getFormat(); + SimpleDateFormat df = new SimpleDateFormat(fmtString); bodyVars.put( varName, quoteString(df.format(varValue))); } @@ -327,7 +336,7 @@ public Date getBodyDate(String varName) { if (val.startsWith(DATE_NULL)) return CommonUtil.newNullDate(); else - return new SimpleDateFormat(DATE_FMT).parse(val); + return new SimpleDateFormat(DateFormat.DATETIME_FMT.getFormat()).parse(val); } catch (ParseException e) { return CommonUtil.newNullDate(); @@ -337,9 +346,9 @@ public Date getBodyDate(String varName) { public Date getBodyDateTime(String varName, Boolean hasMilliseconds) { try{ String val = getJsonStr(varName); - String fmt = DATETIME_FMT; + String fmt = DateFormat.DATETIME_FMT.getFormat(); if (hasMilliseconds) - fmt = DATETIME_FMT_MS; + fmt = DateFormat.DATETIME_FMT_MS.getFormat(); if (val.startsWith(DATETIME_NULL)) return CommonUtil.newNullDate(); @@ -382,16 +391,14 @@ public BigDecimal getBodyNum(String varName) { return new BigDecimal(getJsonStr(varName)); } - public long getBodyLong(String varName) { - long value =0; + public long getBodyLong(String varName) { try{ - value = Long.parseLong(getJsonStr(varName)); + return Long.parseLong(getJsonStr(varName)); } catch(NumberFormatException ex) { - value = Double.valueOf(getJsonStr(varName)).longValue(); - } - return value; + return Double.valueOf(getJsonStr(varName)).longValue(); + } } public int getBodyInt(String varName) { @@ -551,7 +558,9 @@ public void addUploadFile(String filePath, String fileName) { public void RestExecute() { String separator = ""; - queryString = ""; + String queryString = ""; + String bodyString = ""; + if (queryVars.size() > 0) { separator = "?"; for( Map.Entry entry : queryVars.entrySet()) { @@ -559,38 +568,36 @@ public void RestExecute() { separator = "&"; } } - bodyString = ""; if (bodyVars.size() > 0) { separator = ""; for( Map.Entry entry : bodyVars.entrySet()) { - bodyString += separator + "\"" + entry.getKey() + "\":" + entry.getValue() + ""; + bodyString += separator + "\"" + entry.getKey() + "\":" + entry.getValue(); separator = ","; } } if (bodyString.length() > 0) { bodyString = "{" + bodyString + "}"; httpClient.addString( bodyString); - httpClient.addHeader( "Content-Type", contentType); + httpClient.addHeader( CONTENT_TYPE_LABEL, contentType); } else { - if (httpMethod == "POST" || httpMethod == "PUT") { + if (httpMethod.equals("POST") || httpMethod.equals( "PUT")) { bodyString = "{}"; httpClient.addString(bodyString); - httpClient.addHeader("Content-Type", contentType); + httpClient.addHeader(CONTENT_TYPE_LABEL, contentType); } } if (location.getAuthenticationMethod() == 4 && location.getAccessToken() != null && ! location.getAccessToken().trim().isEmpty()) { - httpClient.addHeader("Authorization", location.getAccessToken()); + httpClient.addHeader(AUTHORIZTION_LABEL, location.getAccessToken()); } - if (headerVars.size() > 0) { - separator = ""; + if (headerVars.size() > 0) { for( Map.Entry entry : headerVars.entrySet()) { httpClient.addHeader(entry.getKey(), entry.getValue()); } } headerVars.clear(); String serviceuri = ((location.getSecure() > 0) ? "https" : "http") + "://" + location.getHost(); - serviceuri += (location.getPort() != 80) ? ":" + Integer.toString(location.getPort()): ""; + serviceuri += (location.getPort() != 80) ? ":" + location.getPort(): ""; serviceuri += "/" + location.getBaseURL() + "/" + location.getResourceName(); serviceuri += queryString; httpClient.execute( this.httpMethod, serviceuri); @@ -601,7 +608,7 @@ public void RestExecute() { if (responseCode >= 300 || httpClient.getErrCode() > 0) { errorCode = httpClient.getErrCode(); errorMessage = httpClient.getErrDescription(); - } + } else { try { String response = httpClient.getString(); @@ -622,9 +629,9 @@ public void RestExecute() { } private void logError(int code, String msg) { - logger.error("Error: " + Integer.toString(code) + " " + msg); + logger.error("Error: " + code + " " + msg); } private void logError(int code, String msg, Exception e) { - logger.error("Error: " + Integer.toString(code) + " " + msg, e); + logger.error("Error: " + code + " " + msg, e); } } From 95939346509fc0d7c668114f83e6c8bdb4c4de5b Mon Sep 17 00:00:00 2001 From: a-panizza_globant Date: Fri, 21 Feb 2025 11:13:02 -0300 Subject: [PATCH 3/3] Fix spelling of constant Name and unnecesary temp variables. --- .../main/java/com/genexus/internet/GXRestAPIClient.java | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/java/src/main/java/com/genexus/internet/GXRestAPIClient.java b/java/src/main/java/com/genexus/internet/GXRestAPIClient.java index c71be6c12..220f3fa98 100644 --- a/java/src/main/java/com/genexus/internet/GXRestAPIClient.java +++ b/java/src/main/java/com/genexus/internet/GXRestAPIClient.java @@ -31,7 +31,7 @@ public class GXRestAPIClient { private String contentType = "application/json; charset=utf-8"; static final String CONTENT_TYPE_LABEL = "Content-Type"; - static final String AUTHORIZTION_LABEL = "Authorization"; + static final String AUTHORIZATION_LABEL = "Authorization"; private JSONObject jsonResponse; private HashMap queryVars = new HashMap(); @@ -551,9 +551,8 @@ else if (jsonResponse.length() == 1 && jsonResponse.has("")) { } public void addUploadFile(String filePath, String fileName) { - httpClient.addFile(filePath, fileName); - String mimeType = SpecificImplementation.Application.getContentType(filePath); - contentType = mimeType; + httpClient.addFile(filePath, fileName); + contentType = SpecificImplementation.Application.getContentType(filePath);; } public void RestExecute() { @@ -588,7 +587,7 @@ public void RestExecute() { } } if (location.getAuthenticationMethod() == 4 && location.getAccessToken() != null && ! location.getAccessToken().trim().isEmpty()) { - httpClient.addHeader(AUTHORIZTION_LABEL, location.getAccessToken()); + httpClient.addHeader(AUTHORIZATION_LABEL, location.getAccessToken()); } if (headerVars.size() > 0) { for( Map.Entry entry : headerVars.entrySet()) {