From 97427886b4c934a228267360b1ead348266195ba Mon Sep 17 00:00:00 2001 From: Rama Kocherlakota Date: Mon, 23 Oct 2017 09:21:55 -0400 Subject: [PATCH 1/2] Made apiRequest a public method apiRequest is a very useful method, encapsulating retry logic and handling explicit HTTP result codes that we don't want to repeat in our own code. It would be very helpful to expose it as a public method so that, for instance, we can pass HTTP headers to SalesForce. --- src/main/java/com/force/api/ForceApi.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/force/api/ForceApi.java b/src/main/java/com/force/api/ForceApi.java index d91932b..d80293f 100644 --- a/src/main/java/com/force/api/ForceApi.java +++ b/src/main/java/com/force/api/ForceApi.java @@ -421,7 +421,7 @@ private final String uriBase() { return(session.getApiEndpoint()+"/services/data/"+config.getApiVersionString()); } - private final HttpResponse apiRequest(HttpRequest req) { + public HttpResponse apiRequest(HttpRequest req) { req.setAuthorization("Bearer "+session.getAccessToken()); req.setRequestTimeout(this.config.getRequestTimeout()); HttpResponse res = Http.send(req); From 877be7531f8e17182840868fadc91da972ab5492 Mon Sep 17 00:00:00 2001 From: Rama Kocherlakota Date: Fri, 27 Oct 2017 10:40:50 -0400 Subject: [PATCH 2/2] adding headers to createSObject --- src/main/java/com/force/api/ForceApi.java | 30 ++++++++++++++++------- 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/force/api/ForceApi.java b/src/main/java/com/force/api/ForceApi.java index d80293f..278fa6f 100644 --- a/src/main/java/com/force/api/ForceApi.java +++ b/src/main/java/com/force/api/ForceApi.java @@ -21,6 +21,7 @@ import java.util.ArrayList; import java.util.Iterator; import java.util.List; +import java.util.Collections; import java.util.Map; import java.util.Map.Entry; @@ -193,20 +194,31 @@ public ResourceRepresentation getSObject(String type, String id) throws Resource jsonMapper); } - public String createSObject(String type, Object sObject) { + public String createSObject(String type, Object sObject) { + Map noHeaders = Collections.emptyMap(); + return createSObject(type, sObject, noHeaders); + } + + public String createSObject(String type, Object sObject, Map headers) { try { // We're trying to keep Http classes clean with no reference to JSON/Jackson // Therefore, we serialize to bytes before we pass object to HttpRequest(). // But it would be nice to have a streaming implementation. We can do that // by using ObjectMapper.writeValue() passing in output stream, but then we have // polluted the Http layer. - CreateResponse result = jsonMapper.readValue(apiRequest(new HttpRequest() - .url(uriBase()+"/sobjects/"+type) - .method("POST") - .header("Accept", "application/json") - .header("Content-Type", "application/json") - .expectsCode(201) - .content(jsonMapper.writeValueAsBytes(sObject))).getStream(),CreateResponse.class); + HttpRequest httpRequest = new HttpRequest() + .url(uriBase()+"/sobjects/"+type) + .method("POST") + .header("Accept", "application/json") + .header("Content-Type", "application/json") + .expectsCode(201) + .content(jsonMapper.writeValueAsBytes(sObject)); + + for (Map.Entry headerEntry : headers.entrySet()) { + httpRequest.header(headerEntry.getKey(), headerEntry.getValue()); + } + + CreateResponse result = jsonMapper.readValue(apiRequest(httpRequest).getStream(),CreateResponse.class); if (result.isSuccess()) { return (result.getId()); @@ -421,7 +433,7 @@ private final String uriBase() { return(session.getApiEndpoint()+"/services/data/"+config.getApiVersionString()); } - public HttpResponse apiRequest(HttpRequest req) { + private HttpResponse apiRequest(HttpRequest req) { req.setAuthorization("Bearer "+session.getAccessToken()); req.setRequestTimeout(this.config.getRequestTimeout()); HttpResponse res = Http.send(req);