2012-07-24 5 views
13

Ich versuche, einen einfachen HttpServer in Java zu erstellen, um GET-Anforderungen zu behandeln, , aber wenn ich versuche, die GET-Parameter für eine Anfrage zu erhalten, bemerkte ich, dass die HttpExchange-Klasse keine Methode dafür hat.Wie erhält man die Abfragezeichenfolge in einem GET mit Java HttpServer/HttpExchange?

Kennt jemand eine einfache Möglichkeit, die GET-Parameter (Abfragezeichenfolge) zu lesen?

Dies ist, wie mein Handler wie folgt aussieht:

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

.. und das Hauptverfahren:

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

Ein einfacher Weg? Parsen Sie den URI; es ist nur eine Anfrage bekommen. Wenn Sie mit Posts umgehen müssen, können Dinge wie [this] (http://leonardom.wordpress.com/2009/08/06/getting-parameters-from-httpexchange/) hilfreich sein. –

Antwort

26

Die folgende: httpExchange.getRequestURI().getQuery()

Zeichenfolge im Format ähnlich wie diese angezeigt werden können: "field1=value1&field2=value2&field3=value3..."

so können Sie stri einfach parsen ng selbst, das ist, wie Funktion für die Analyse aussehen könnte:

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

Und das ist, wie Sie es verwenden könnte:

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

Wichtig zu wissen: Die Abfrage könnte null sein. Du solltest das überprüfen. – MinecraftShamrock

+5

Danke für diese Antwort! Für Params, deren Wert ein Und-Zeichen enthält, schlägt es jedoch fehl. Um dies zu beheben, verwenden Sie 'getRawQuery()' anstelle von 'getQuery()', dann 'param = java.net.URLDecoder.decode (param," UTF-8 ")' nach dem Teilen auf "&". – Evan

+1

@Evan, ich glaube, die Entschlüsselung sollte passieren, wenn Sie den Wert in die Map setzen - so verlieren Sie keinen Teil des Wertes, wenn ein '=' drin ist. –

0

Building von @ anon01 auf die Antwort, das ist, wie es geht in 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]): ""] 
     } 
    } 
} 

Und das ist, wie es zu benutzen:

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

Gut, danke. Aber die Frage ist für Java, nicht Goovy;) – Tibor

1

Diese Antwort entschlüsselt, im Gegensatz zu annon01, die Schlüssel und Werte. Es verwendet String.split nicht, aber scannt die Zeichenfolge mit indexOf, die schneller ist.

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