如何使用Java HttpServer/HttpExchange在GET中获取查询字符串?

Tib*_*bor 18 java get httpserver query-string

我试图在Java中创建一个简单的HttpServer来处理GET请求,但是当我尝试获取请求的GET参数时,我注意到HttpExchange类没有方法.

有没有人知道一种简单的方法来读取GET参数(查询字符串)?

这是我的处理程序的样子:

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();
  } 
}
Run Code Online (Sandbox Code Playgroud)

..和主要方法:

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();
}
Run Code Online (Sandbox Code Playgroud)

小智 37

下列: httpExchange.getRequestURI().getQuery()

将以与此类似的格式返回字符串: "field1=value1&field2=value2&field3=value3..."

所以你可以简单地自己解析字符串,这就是解析函数的样子:

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;
}
Run Code Online (Sandbox Code Playgroud)

这就是你如何使用它:

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

  • 谢谢你的回答!但是,它的值包括一个&符号的params失败了.要修复,在分割"&"后使用`getRawQuery()`而不是`getQuery()`,然后使用`param = java.net.URLDecoder.decode(param,"UTF-8")`. (8认同)
  • @Evan,我相信将值放入Map中时应该进行解码-这样,如果其中包含“ =”,就不会丢失部分值。 (2认同)