转自:http://leonardom.wordpress.com/2009/08/06/getting-parameters-from-httpexchange/
You now in Java 6 has some APIs to create lightweight HTTP server. Well, today, I had to created a lightweight HTTP server embedded in an application, but when I try to get the parameters for a request I noticed the HttpExchange class doesn’t have a method for that.
After some researches on Google, I come across a solution.
What I did was to create a Filter class which will deal with the parameters parse:
public class ParameterFilter extends Filter { @Override public String description() { return "Parses the requested URI for parameters"; } @Override public void doFilter(HttpExchange exchange, Chain chain) throws IOException { parseGetParameters(exchange); parsePostParameters(exchange); chain.doFilter(exchange); } private void parseGetParameters(HttpExchange exchange) throws UnsupportedEncodingException { Map<String, Object> parameters = new HashMap<String, Object>(); URI requestedUri = exchange.getRequestURI(); String query = requestedUri.getRawQuery(); parseQuery(query, parameters); exchange.setAttribute("parameters", parameters); } private void parsePostParameters(HttpExchange exchange) throws IOException { if ("post".equalsIgnoreCase(exchange.getRequestMethod())) { @SuppressWarnings("unchecked") Map<String, Object> parameters = (Map<String, Object>)exchange.getAttribute("parameters"); InputStreamReader isr = new InputStreamReader(exchange.getRequestBody(),"utf-8"); BufferedReader br = new BufferedReader(isr); String query = br.readLine(); parseQuery(query, parameters); } } @SuppressWarnings("unchecked") private void parseQuery(String query, Map<String, Object> parameters) throws UnsupportedEncodingException { if (query != null) { String pairs[] = query.split("[&]"); for (String pair : pairs) { String param[] = pair.split("[=]"); String key = null; String value = null; if (param.length > 0) { key = URLDecoder.decode(param[0], System.getProperty("file.encoding")); } if (param.length > 1) { value = URLDecoder.decode(param[1], System.getProperty("file.encoding")); } if (parameters.containsKey(key)) { Object obj = parameters.get(key); if(obj instanceof List<?>) { List<String> values = (List<String>)obj; values.add(value); } else if(obj instanceof String) { List<String> values = new ArrayList<String>(); values.add((String)obj); values.add(value); parameters.put(key, values); } } else { parameters.put(key, value); } } } } }
After that you can add this filter to your HttpServer context:
HttpServer server = HttpServer.create(new InetSocketAddress(80), 0); HttpContext context = server.createContext("/myapp", new myHttpHandler()); context.getFilters().add(new ParameterFilter()); server.start();
Then you can do something like below in your HttpHandler to get the parameters:
public class MyHttpHandler implements HttpHandler { @Override public void handle(HttpExchange exchange) throws IOException { Map<String, Object> params = (Map<String, Object>)exchange.getAttribute("parameters"); //now you can use the params } }
Well, that’s all! I hope you enjoy the tip!