Creé una herramienta personalizada en AEM y quería que la herramienta personalizada llamara a un servlet (POST json).
Se llamó al servlet, pero request.getParameterMap() devolvió un mapa vacío.
Mi código de servlet es
@Component( service=Servlet.class, property={ Constants.SERVICE_DESCRIPTION + "=Custom Servlet", "sling.servlet.methods=" + HttpConstants.METHOD_POST, "sling.servlet.paths=" + "/apps/myapp/customServlet" } ) public class CustomServlet extends SlingAllMethodsServlet{ @Override protected void doPost(SlingHttpServletRequest request, SlingHttpServletResponse response) throws IOException { String method = request.getMethod(); // method POST OK Map map = request.getParameterMap(); // return map but empty String name = request.getParameter("foo"); // also this return null response.setStatus(SlingHttpServletResponse.SC_OK); response.setContentType("application/json;charset=UTF-8"); response.getWriter().print("{\"response message\" : \"" + foo + "\"}"); } }y mi código JS (cargado en la página de herramientas personalizadas de AEM como biblioteca cliente)
window.onload = function() { var url = '/apps/myapp/customServlet'; var button = document.getElementById('btnSubmit'); button.addEventListener('click', event => { var foo = document.getElementById('foo').value; if (foo.length < 1){ alert("input required!!"); } else { var requestData = {}; requestData.foo= foo; console.log(requestData); // it is ok postData(url,requestData).then(data => {console.log(data);}); // got {response message:null} } }); } async function postData(url, data){ const response = await fetch(url, { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify(data) }); return response.json(); }Además, eliminé POST en los métodos de filtro en Adobe Granite CSRF Filter Config.
¿Necesito alguna otra configuración OSGi o algún problema con mi código para usar Post Servlet en AEM?
Para obtener la carga útil del cuerpo de la solicitud, puede usar request.getReader()
Por ejemplo:
String body = IOUtils.toString(request.getReader()); //apache commons ioO use algún mapeador json para obtener inmediatamente su objeto Java
YourObject yourObject = new ObjectMapper().readValue(request.getReader(), YourObject.class); // jacksonestoy viendo
var requestData = {}; // creating an empty arrayy estás publicando esto en el servlet.
Creo que desea analizar 'foo' desde document.getElementById hasta el servlet.