Tratar Envio De Formulário
[AEM Forms 6.5]{class="badge informative"}
Nesta parte, criaremos um servlet simples que é executado no AEM Publish para lidar com o envio de formulários PDF ou HTML5. Este servlet faz uma solicitação POST HTTP em um servlet em execução em uma instância de autor do AEM responsável por salvar os dados enviados como um nó nt:file
no repositório do autor do AEM.
A seguir está o código do servlet que lida com o envio do formulário do PDF/HTML5. Neste servlet, fazemos uma chamada POST para um servlet montado em /bin/startworkflow em uma instância de autor do AEM. Esse servlet salva os dados do formulário no repositório do autor do AEM.
Servlet de publicação do AEM
O código a seguir lida com o envio do formulário do PDF/HTML5. Esse código é executado na instância de publicação.
package com.aemforms.mobileforms.core.servlets;
import com.aemforms.mobileforms.core.configuration.service.AemServerCredentialsConfigurationService;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import org.apache.sling.api.SlingHttpServletRequest;
import org.apache.sling.api.SlingHttpServletResponse;
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.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.servlet.Servlet;
import javax.servlet.ServletInputStream;
import javax.servlet.ServletOutputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.Serializable;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Base64;
import java.util.List;
@Component(service={Servlet.class}, property={"sling.servlet.methods=post", "sling.servlet.paths=/bin/handleformsubmission"})
public class HandleFormSubmission extends SlingAllMethodsServlet implements Serializable {
private static final long serialVersionUID = 1L;
private final transient Logger logger = LoggerFactory.getLogger(this.getClass());
@Reference
AemServerCredentialsConfigurationService aemServerCredentialsConfigurationService;
protected void doPost(SlingHttpServletRequest request, SlingHttpServletResponse response) {
logger.debug("In do POST of bin/handleformsubmission");
ByteArrayOutputStream result = new ByteArrayOutputStream();
try {
ServletInputStream is = request.getInputStream();
byte[] buffer = new byte[1024];
int length;
while ((length = is.read(buffer)) != -1) {
result.write(buffer, 0, length);
}
logger.debug(result.toString(StandardCharsets.UTF_8.name()));
} catch (IOException e1) {
logger.error("An error occurred", e1);
}
String postURL = aemServerCredentialsConfigurationService.getWorkflowServer();
logger.debug("The url to invoke workflow is "+postURL);
HttpPost postReq = new HttpPost(postURL);
// This is the base64 encoding of the admin credentials. This call should be made over HTTPS in production scenarios to avoid leaking credentials.
String userName = aemServerCredentialsConfigurationService.getUserName();
String password = aemServerCredentialsConfigurationService.getPassword();
String credential = userName+":"+password;
String encodedString = Base64.getEncoder().encodeToString(credential.getBytes());
postReq.addHeader("Authorization", "Basic "+encodedString);
System.out.println("The encoded string is "+"Basic "+encodedString);
CloseableHttpClient httpClient = HttpClients.createDefault();
List<NameValuePair> urlParameters = new ArrayList<NameValuePair>();
logger.debug("added url parameters");
try {
urlParameters.add(new BasicNameValuePair("xmlData", result.toString(StandardCharsets.UTF_8.name())));
postReq.setEntity(new UrlEncodedFormEntity(urlParameters));
HttpResponse httpResponse = httpClient.execute(postReq);
logger.debug("Sent request to author instance");
String startWorkflowResponse = EntityUtils.toString(httpResponse.getEntity());
response.setContentType("text/plain");
PrintWriter out = response.getWriter();
out.write(startWorkflowResponse);
} catch (IOException e) {
logger.error("An error occurred", e);
}
}
}