繁体   English   中英

无法在 XPage ServiceBean 中获取多部分/表单数据 POST 请求主体的句柄

[英]Unable to get a handle on the body of a multipart/form-data POST request in XPage ServiceBean

我有一个基于引导框架的 xpage,它使用 jQuery $post 提交页面中包含的 forms。 这些是使用 multipart/form-data 内容类型发布的,所以我无法控制。 我已经设置了一个 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 客户端将一些多部分表单数据值发布到 URL 但再次没有返回任何内容。 但是,如果我尝试使用 application/json 内容类型发布一些 json 并使用上面显示的最后一种方法,我可以看到 json 打印到控制台。

使用带有多部分 POST 的 extLib REST 控件和 java servicebean 是否存在一些问题? 我知道您只能读取请求 stream 一次,以便先前使用例如 request.properties 将使 stream 此后为空,但事实并非如此,并且可能 Z466DEEC76ECDF5FCA6D38571F632 也不会显示。

非常感谢

如果它是与 POST 请求一起发送到 ExtLib Rest 控件的 multipart/formdata,您可以像这样获取提交数据的句柄:

for (Object e : req.getParameterMap().entrySet()) {
                
    Map.Entry entry = (Map.Entry) e;                
    System.out.println("got " + entry.getKey() + "/" + entry.getValue().getClass().getCanonicalName());
                
}

map 中的条目可以是表单字段或上传的文件。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM