java get query-string httpserver

¿Cómo obtener la cadena de consulta en un GET con Java HttpServer/HttpExchange?



query-string (3)

Estoy intentando crear un HttpServer simple en Java para manejar las solicitudes GET, pero cuando trato de obtener los parámetros GET para una solicitud, noté que la clase HttpExchange no tiene un método para eso.

¿Alguien sabe una manera fácil de leer los parámetros GET (cadena de consulta)?

Así es como se ve mi manejador:

public class TestHandler{ @Override public void handle(HttpExchange exc) throws IOxception { String response = "This is the reponse"; exc.sendResponseHeaders(200, response.length()); // need GET params here OutputStream os = exc.getResponseBody(); os.write(response.getBytes()); os.close(); } }

.. y el método principal:

public static void main(String[] args) throws Exception{ // create server on port 8000 InetSocketAddress address = new InetSocketAddress(8000); HttpServer server = new HttpServer.create(address, 0); // bind handler server.createContext("/highscore", new TestHandler()); server.setExecutor(null); server.start(); }


Esta respuesta, contrariamente a la de annon01, decodifica adecuadamente las claves y los valores. No usa String.split , pero escanea la cadena usando indexOf , que es más rápido.

public static Map<String, String> parseQueryString(String qs) { Map<String, String> result = new HashMap<>(); if (qs == null) return result; int last = 0, next, l = qs.length(); while (last < l) { next = qs.indexOf(''&'', last); if (next == -1) next = l; if (next > last) { int eqPos = qs.indexOf(''='', last); try { if (eqPos < 0 || eqPos > next) result.put(URLDecoder.decode(qs.substring(last, next), "utf-8"), ""); else result.put(URLDecoder.decode(qs.substring(last, eqPos), "utf-8"), URLDecoder.decode(qs.substring(eqPos + 1, next), "utf-8")); } catch (UnsupportedEncodingException e) { throw new RuntimeException(e); // will never happen, utf-8 support is mandatory for java } } last = next + 1; } return result; }


Lo siguiente: httpExchange.getRequestURI().getQuery()

devolverá una cadena en un formato similar a este: "field1=value1&field2=value2&field3=value3..."

así que simplemente puedes analizar la cadena, así es como se vería la función de análisis:

public Map<String, String> queryToMap(String query) { Map<String, String> result = new HashMap<>(); for (String param : query.split("&")) { String[] entry = param.split("="); if (entry.length > 1) { result.put(entry[0], entry[1]); }else{ result.put(entry[0], ""); } } return result; }

Y así es como puedes usarlo:

Map<String, String> params = queryToMap(httpExchange.getRequestURI().getQuery()); System.out.println("param A=" + params.get("A"));


Sobre la base de la respuesta de @ anon01, esta es la forma de hacerlo en Groovy:

Map<String,String> getQueryParameters( HttpExchange httpExchange ) { def query = httpExchange.getRequestURI().getQuery() return query.split( ''&'' ) .collectEntries { String[] pair = it.split( ''='' ) if (pair.length > 1) { return [(pair[0]): pair[1]] } else { return [(pair[0]): ""] } } }

Y así es como se usa:

def queryParameters = getQueryParameters( httpExchange ) def parameterA = queryParameters[''A'']