无法在 XPage ServiceBean 中获取 multipart/form-data POST 请求正文的句柄
Unable to get a handle on the body of a multipart/form-data POST request in XPage ServiceBean
我有一个基于 bootstrap 框架的 xpage,它使用 jQuery $post 提交页面中包含的表单。这些使用 multipart/form-data 内容类型得到 posted,所以我无法控制它。我已经设置了一个 REST.xsp 包含一个调用 java ServiceBean 的 RESTService。我试过的最新方法如下:
private void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
// TODO Auto-generated method stub
try{
ServletFileUpload upload = new ServletFileUpload();
FileItemIterator iterator = upload.getItemIterator(request);
System.out.println("test");
while (iterator.hasNext()) {
System.out.println("test2");
FileItemStream item = iterator.next();
InputStream stream = item.openStream();
if (item.isFormField()) {
byte[] str = new byte[stream.available()];
stream.read(str);
String pFieldValue = new String(str,"UTF8");
System.out.println("text Value : "+pFieldValue);
if(item.getFieldName().equals("textBoxFormElement")){
System.out.println("text Value : "+pFieldValue);
}
}
}
}catch (Exception e) {
e.printStackTrace();
}
}
但我似乎无法让服务器获取已发布的表单数据。我可以在控制台上看到“测试”,但它没有命中“test2”。
我已经尝试了所有我能找到的建议,包括:
try {
InputStream inputStream = request.getInputStream();
Reader inputStreamReader = new InputStreamReader(inputStream);
String allChars = "";
System.out.println("test");
int data = inputStreamReader.read();
while(data != -1){
System.out.println("test2");
char theChar = (char) data;
System.out.println(theChar);
allChars = allChars + theChar;
data = inputStreamReader.read();
}
inputStreamReader.close();
}
catch (IOException e) {
System.out.println("No body data readable: " + e.getMessage() );
}
(仍然没有“test2”)...并且:
String requestBody = extractPostRequestBody(request);
System.out.println(requestBody);
private static String extractPostRequestBody(HttpServletRequest request) {
Scanner s = null;
try {
s = new Scanner(request.getInputStream(), "UTF-8").useDelimiter("\A");
} catch (IOException e) {
e.printStackTrace();
}
return s.hasNext() ? s.next() : "";
}
(控制台未打印任何内容)。
我也尝试过使用 REST 客户端 post 一些多部分表单数据值到 URL 但同样没有返回任何内容。但是,如果我尝试使用 application/json 内容类型发布一些 json 并使用上面显示的最后一种方法,我可以看到 json 被打印到控制台。
使用 extLib REST 控件和带有多部分 POST 的 java servicebean 是否可能存在一些问题?我知道您只能读取一次请求流,以便之前使用例如 request.properties 之后会使流变为空,但情况并非如此,并且可能 json 如果它也不会显示是。
非常感谢
如果 multipart/formdata 与 POST 请求一起发送到 ExtLib Rest 控件,您可以像这样获取提交数据的句柄:
for (Object e : req.getParameterMap().entrySet()) {
Map.Entry entry = (Map.Entry) e;
System.out.println("got " + entry.getKey() + "/" + entry.getValue().getClass().getCanonicalName());
}
地图中的条目可以是表单域或上传的文件。
我有一个基于 bootstrap 框架的 xpage,它使用 jQuery $post 提交页面中包含的表单。这些使用 multipart/form-data 内容类型得到 posted,所以我无法控制它。我已经设置了一个 REST.xsp 包含一个调用 java ServiceBean 的 RESTService。我试过的最新方法如下:
private void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
// TODO Auto-generated method stub
try{
ServletFileUpload upload = new ServletFileUpload();
FileItemIterator iterator = upload.getItemIterator(request);
System.out.println("test");
while (iterator.hasNext()) {
System.out.println("test2");
FileItemStream item = iterator.next();
InputStream stream = item.openStream();
if (item.isFormField()) {
byte[] str = new byte[stream.available()];
stream.read(str);
String pFieldValue = new String(str,"UTF8");
System.out.println("text Value : "+pFieldValue);
if(item.getFieldName().equals("textBoxFormElement")){
System.out.println("text Value : "+pFieldValue);
}
}
}
}catch (Exception e) {
e.printStackTrace();
}
}
但我似乎无法让服务器获取已发布的表单数据。我可以在控制台上看到“测试”,但它没有命中“test2”。
我已经尝试了所有我能找到的建议,包括:
try {
InputStream inputStream = request.getInputStream();
Reader inputStreamReader = new InputStreamReader(inputStream);
String allChars = "";
System.out.println("test");
int data = inputStreamReader.read();
while(data != -1){
System.out.println("test2");
char theChar = (char) data;
System.out.println(theChar);
allChars = allChars + theChar;
data = inputStreamReader.read();
}
inputStreamReader.close();
}
catch (IOException e) {
System.out.println("No body data readable: " + e.getMessage() );
}
(仍然没有“test2”)...并且:
String requestBody = extractPostRequestBody(request);
System.out.println(requestBody);
private static String extractPostRequestBody(HttpServletRequest request) {
Scanner s = null;
try {
s = new Scanner(request.getInputStream(), "UTF-8").useDelimiter("\A");
} catch (IOException e) {
e.printStackTrace();
}
return s.hasNext() ? s.next() : "";
}
(控制台未打印任何内容)。
我也尝试过使用 REST 客户端 post 一些多部分表单数据值到 URL 但同样没有返回任何内容。但是,如果我尝试使用 application/json 内容类型发布一些 json 并使用上面显示的最后一种方法,我可以看到 json 被打印到控制台。
使用 extLib REST 控件和带有多部分 POST 的 java servicebean 是否可能存在一些问题?我知道您只能读取一次请求流,以便之前使用例如 request.properties 之后会使流变为空,但情况并非如此,并且可能 json 如果它也不会显示是。
非常感谢
如果 multipart/formdata 与 POST 请求一起发送到 ExtLib Rest 控件,您可以像这样获取提交数据的句柄:
for (Object e : req.getParameterMap().entrySet()) {
Map.Entry entry = (Map.Entry) e;
System.out.println("got " + entry.getKey() + "/" + entry.getValue().getClass().getCanonicalName());
}
地图中的条目可以是表单域或上传的文件。