如何在httpcomponents nio服务器处理程序中解析post请求?

时间:2015-01-16 23:26:39

标签: apache-httpcomponents

我使用httpcomponenets nio服务器来处理邮件请求文件上传。

以下是示例代码。我有数据字节数组中的完整数据,包括由边界分隔的参数,上传文件等。是否有解析数据并获取参数的解析器实用程序?像request.getParameter(" param1"),request.getFile()等。

    public static void main(String[] args) throws Exception {
       int port = 8280;

       // Create HTTP protocol processing chain
       HttpProcessor httpproc = HttpProcessorBuilder.create()
           .add(new ResponseDate())
           .add(new ResponseServer("Test/1.1"))
           .add(new ResponseContent())
           .add(new ResponseConnControl()).build();
       // Create request handler registry
       UriHttpAsyncRequestHandlerMapper reqistry = new UriHttpAsyncRequestHandlerMapper();
       // Register the default handler for all URIs
       reqistry.register("/test*", new RequestHandler());
       // Create server-side HTTP protocol handler
       HttpAsyncService protocolHandler = new HttpAsyncService(httpproc, reqistry) {

           @Override
           public void connected(final NHttpServerConnection conn) {
               System.out.println(conn + ": connection open");
               super.connected(conn);
           }

           @Override
           public void closed(final NHttpServerConnection conn) {
               System.out.println(conn + ": connection closed");
               super.closed(conn);
           }

       };
       // Create HTTP connection factory
       NHttpConnectionFactory<DefaultNHttpServerConnection> connFactory;

           connFactory = new DefaultNHttpServerConnectionFactory(
               ConnectionConfig.DEFAULT);
       // Create server-side I/O event dispatch
       IOEventDispatch ioEventDispatch = new DefaultHttpServerIODispatch(protocolHandler, connFactory);
       // Set I/O reactor defaults
       IOReactorConfig config = IOReactorConfig.custom()
           .setIoThreadCount(1)
           .setSoTimeout(3000)
           .setConnectTimeout(3000)
           .build();
       // Create server-side I/O reactor
       ListeningIOReactor ioReactor = new DefaultListeningIOReactor(config);
       try {
           // Listen of the given port
           ioReactor.listen(new InetSocketAddress(port));
           // Ready to go!
           ioReactor.execute(ioEventDispatch);
       } catch (InterruptedIOException ex) {
           System.err.println("Interrupted");
       } catch (IOException e) {
           System.err.println("I/O error: " + e.getMessage());
       }
       System.out.println("Shutdown");
   }
public static class RequestHandler implements HttpAsyncRequestHandler<HttpRequest> {
   public void handleInternal(HttpRequest httpRequest, HttpResponse httpResponse, HttpContext httpContext) throws HttpException, IOException {

       HttpEntity entity = null;
       if (httpRequest instanceof HttpEntityEnclosingRequest)
           entity = ((HttpEntityEnclosingRequest)httpRequest).getEntity();

       byte[] data;
       if (entity == null) {
           data = new byte [0];
       } else {
           data = EntityUtils.toByteArray(entity);
       }

       System.out.println(new String(data));

       httpResponse.setEntity(new StringEntity("success response"));
   }

   @Override public HttpAsyncRequestConsumer<HttpRequest> processRequest(HttpRequest request, HttpContext context) throws HttpException, IOException {
       return new BasicAsyncRequestConsumer();
   }

   @Override
   public void handle(HttpRequest request, HttpAsyncExchange httpExchange, HttpContext context) throws HttpException, IOException {
       HttpResponse response = httpExchange.getResponse();
       handleInternal(request, response, context);
       httpExchange.submitResponse(new BasicAsyncResponseProducer(response));

   }
}

1 个答案:

答案 0 :(得分:1)

MIME内容解析(以及任何类型内容的处理)超出了Apache HttpComponents的范围。请考虑使用Apache Mime4J