如何在HttpAsyncRequestHandler中获取post params

时间:2015-01-18 04:17:19

标签: java apache-httpcomponents

我使用Apache HttpCore HttpAsyncRequestHandler来处理POST请求。 我怎样才能获得表格提交的参数?

1 个答案:

答案 0 :(得分:0)

处理程序中可用的帖子正文。 EntityUtils.toByteArray(httpRequest.getEntity())会为您提供全部数据。

我没有找到任何通用实用程序来解析它。 我写了一个自定义解析器,它可以让我获取params和任何上传的文件。

下面的代码为我提供了params map中的params和输出中的文件内容。当所有数据都在内存中时,它会因巨大的文件而崩溃。 (警告:WIP)

        InputStream inputStream = new ByteArrayInputStream(data);
        ByteArrayOutputStream output = new ByteArrayOutputStream();
        HashMap<String, String> params = new HashMap<>();
        BufferedReader reader = new BufferedReader(new InputStreamReader(input));
        String currentLine = reader.readLine();
        String boundary = currentLine;

        while(reader.ready()) {
            currentLine = reader.readLine();
            if (currentLine.contains("Content-Disposition: form-data;")) {
                String paramName = currentLine;
                paramName = paramName.replace("Content-Disposition: form-data; name=","").replace("\"","");
                StringBuilder paramValue = new StringBuilder();
                if(paramName.contains("filename")) {
                    String[] temp = paramName.split(";");
                    paramName = temp[0];
                    paramValue.append(temp[1].replace("filename", "").replace("=", "").replace(" ", ""));
                } else {
                    currentLine = reader.readLine();
                    while(!currentLine.contains(boundary)) {
                        paramValue.append(currentLine);
                        currentLine = reader.readLine();
                    }
                }
                params.put(paramName, paramValue.toString());
            }
            if (currentLine.contains("Content-Type: ")) {
                // File Content here
                reader.readLine();

                String prevLine = reader.readLine();
                currentLine = reader.readLine();

                //writing the data to a output stream
                while (true) {
                    if (currentLine.contains(boundary)) {
                        output.write(prevLine.getBytes());
                        break;
                    }
                    else {
                        output.write(currentLine.getBytes());
                    }
                    prevLine = currentLine;
                    currentLine = reader.readLine();
                }

            }
        }