javagetquery-stringhttpserver

How to obtain the query string in a GET with Java HttpServer/HttpExchange?


I am trying to create a simple HttpServer in Java to handle GET requests, but when I try to get the GET parameters for a request I noticed the HttpExchange class does not have a method for that.

Does anybody know an easy way to read the GET parameters (query string)?

This is how my handler looks like:

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();
  } 
}

.. and the main method:

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();
}

Solution

  • The following: httpExchange.getRequestURI().getQuery()

    will return string in format similar to this: "field1=value1&field2=value2&field3=value3..."

    so you could simply parse string yourself, this is how function for parsing could look like:

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

    And this is how you could use it:

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

    Note: URLDecoder.decode allows to manage special characters liek +.