AEM 中的 Servlet,POST 请求中的正文丢失
Servlet in AEM, body in POST request is lost
我在 AEM 中创建了一个自定义工具,我希望该自定义工具调用 servlet(POST json)。
调用了 servlet,但是 request.getParameterMap() return 空映射。
我的 servlet 代码是
@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 + "\"}");
}
}
和我的 JS 代码(作为客户端库加载到 AEM 自定义工具页面)
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();
}
此外,我在 Adobe Granite CSRF 过滤器配置中删除了 POST 过滤方法。
我是否需要任何其他 OSGi 配置或我的代码有问题才能在 AEM 中使用 Post Servlet?
要从请求正文中获取负载,您可以使用request.getReader()
例如:
String body = IOUtils.toString(request.getReader()); //apache commons io
或者使用某些 json 映射器立即获取您的 java 对象
YourObject yourObject = new ObjectMapper().readValue(request.getReader(), YourObject.class); // jackson
我看到了
var requestData = {}; // creating an empty array
并且您正在将其发布到 servlet。
我认为您想将 'foo' 从 document.getElementById
解析到 servlet。
我在 AEM 中创建了一个自定义工具,我希望该自定义工具调用 servlet(POST json)。
调用了 servlet,但是 request.getParameterMap() return 空映射。
我的 servlet 代码是
@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 + "\"}");
}
}
和我的 JS 代码(作为客户端库加载到 AEM 自定义工具页面)
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();
}
此外,我在 Adobe Granite CSRF 过滤器配置中删除了 POST 过滤方法。
我是否需要任何其他 OSGi 配置或我的代码有问题才能在 AEM 中使用 Post Servlet?
要从请求正文中获取负载,您可以使用request.getReader()
例如:
String body = IOUtils.toString(request.getReader()); //apache commons io
或者使用某些 json 映射器立即获取您的 java 对象
YourObject yourObject = new ObjectMapper().readValue(request.getReader(), YourObject.class); // jackson
我看到了
var requestData = {}; // creating an empty array
并且您正在将其发布到 servlet。
我认为您想将 'foo' 从 document.getElementById
解析到 servlet。