post call to rest api using parameters from AEM form | Community
Skip to main content
November 28, 2022
Solved

post call to rest api using parameters from AEM form

  • November 28, 2022
  • 3 replies
  • 1268 views

How to pass post parameters from a AEM form to REST 3rd party api and handle the parameters in servlet and using HttpsURLConnection

This post is no longer active and is closed to new replies. Need help? Start a new post to ask your question.
Best answer by workflowuser

when your form is submitting to a servlet, write the following code in your servlet

Enumeration<String> params = request.getParameterNames();
while(params.hasMoreElements())
{
String paramName = params.nextElement();
System.out.println("The param Name is "+paramName);
String data = request.getParameter(paramName);System.out.println("The data  is "+data);
}

. You will get to see the parameters passed to your servlet. You can then process the data as needed 

3 replies

Adobe Employee
November 28, 2022

when you submit your form to your REST endpoint the entire form data is available in the servlet. You can convert the input stream to w3c.org.Document and then parse the xml as per your needs

Avinash_Gupta_
Community Advisor and Adobe Champion
Community Advisor and Adobe Champion
November 29, 2022

@jadish I recently worked on similar kind of implementation and below code of snippet would be really helpful for you. This implementation is done through core AEM form container component. In your servlet, 

 

1. Get the form data through request.getRequestParameterMap .

2. removing all OOB form data like ":formstart", "_charset_", ":redirect", ":cq_csrf_token". You can also read  parameters through request.getParamter("Object") in case if it's handful.

3. Creating httpClient post object , pass all the form data as entity and execute the client object

 

 

import com.google.common.collect.ImmutableSet;

import org.apache.commons.lang3.StringUtils;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.mime.MultipartEntityBuilder;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.apache.sling.api.SlingHttpServletRequest;
import org.apache.sling.api.SlingHttpServletResponse;
import org.apache.sling.api.request.RequestParameter;
import org.apache.sling.api.resource.Resource;
import org.apache.sling.api.resource.ValueMap;
import org.apache.sling.api.servlets.HttpConstants;
import org.apache.sling.api.servlets.SlingAllMethodsServlet;
import org.apache.sling.servlets.annotations.SlingServletResourceTypes;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Reference;
import org.osgi.service.component.propertytypes.ServiceDescription;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.servlet.Servlet;
import java.io.IOException;
import java.io.InputStream;
import java.util.*;
import java.util.stream.Collectors;

@Component(service = { Servlet.class })
@SlingServletResourceTypes(
resourceTypes={
"<<Your resource type name>>",
},
methods= HttpConstants.METHOD_POST,
extensions="bin",
selectors="post")
@ServiceDescription("Handles submission of form to REST endpoint")
public class SubmitToRestServlet extends SlingAllMethodsServlet {

private static final Logger LOGGER = LoggerFactory.getLogger(SubmitToRestServlet.class);
private static final String AUTHORIZATION = "Authorization";
private static final String BEARER = "Bearer";

private static final String REST_FORM_ENDPOINT_URL = "restServiceEndPointUrl";
private static final String REDIRECT_PROP = "redirect";

 

private static final Set<String> INTERNAL_PARAMETER = ImmutableSet.of(
":formstart",
"_charset_",
":redirect",
":cq_csrf_token"
);

@Override
protected void doPost(SlingHttpServletRequest request, SlingHttpServletResponse response) throws IOException {
Resource formContainerResource = request.getResource();
String accessToken = apiTokenService.getAccessToken();
ValueMap valueMap = formContainerResource.adaptTo(ValueMap.class);
if (valueMap != null) {
String endPointUrl = valueMap.get(REST_FORM_ENDPOINT_URL, String.class);
String[] recipients = valueMap.get("mailto", String[].class);
String redirect = valueMap.get(REDIRECT_PROP, String.class);
redirect = formContainerResource.getResourceResolver().map(redirect) + ".html";
if (StringUtils.isNotEmpty(endPointUrl)) {
HttpEntity formData;
CloseableHttpClient httpClient = HttpClients.createDefault();
int status = 200;
try {
formData = getFormData(request, recipients);
HttpPost httpPost = new HttpPost(endPointUrl);
httpPost.setHeader(AUTHORIZATION, BEARER + " " + accessToken);
httpPost.setEntity(formData);
HttpResponse httpResponse = httpClient.execute(httpPost);
LOGGER.info("response {}", httpResponse.getStatusLine().getStatusCode() ) ;
LOGGER.info("response-body {}", EntityUtils.toString(httpResponse.getEntity(), "UTF-8"));
httpClient.close();
status = httpResponse.getStatusLine().getStatusCode();
assert httpResponse.getStatusLine().getStatusCode() == 200 : "API Error";
response.sendRedirect(redirect);
} catch (AssertionError e) {
LOGGER.error("Error", e);
response.setStatus(status);
} catch (IOException e) {
LOGGER.error("Error", e);
response.setStatus(status);
} finally {
httpClient.close();
}
}
}
}

public static HttpEntity getFormData(SlingHttpServletRequest request, String[] recipients) {
Map<String, RequestParameter[]> params = request.getRequestParameterMap();
MultipartEntityBuilder builder = MultipartEntityBuilder.create();
builder.addTextBody("Recipients", String.format("[%s]", Arrays.stream(recipients)
.map(s -> String.format("{\"Address\":\"%s\", \"Display\":\"%s\", \"RecipientType\":0}", s, s))
.collect(Collectors.joining(","))));
builder.addTextBody("Subject", "Test");
for (Map.Entry<String, RequestParameter[]> entry : params.entrySet()) {
if (!INTERNAL_PARAMETER.contains(entry.getKey())) {
RequestParameter[] v = entry.getValue();
RequestParameter p = v[0];
if (p == null) continue;
if (p.isFormField()) {
builder.addTextBody(entry.getKey(), p.getString());
} else {
try {
InputStream stream = p.getInputStream();
builder.addBinaryBody(entry.getKey(), stream, ContentType.parse(p.getContentType()), p.getFileName());
} catch (IOException e) {
LOGGER.error("Error", e);
}
}
}
}
return builder.build();
}

}

 

Hope this helps.

workflowuserAdobe EmployeeAccepted solution
Adobe Employee
November 29, 2022

when your form is submitting to a servlet, write the following code in your servlet

Enumeration<String> params = request.getParameterNames();
while(params.hasMoreElements())
{
String paramName = params.nextElement();
System.out.println("The param Name is "+paramName);
String data = request.getParameter(paramName);System.out.println("The data  is "+data);
}

. You will get to see the parameters passed to your servlet. You can then process the data as needed