2012-07-24 23 views
13

GET isteklerini, 'u işlemek için Java'da basit bir HttpServer oluşturmaya çalışıyorum ancak bir istek için GET parametrelerini almaya çalıştığımda HttpExchange sınıfının bunun için bir yöntemi olmadığını fark ettim.Java HttpServer/HttpExchange ile bir GET'de sorgu dizesi nasıl elde edilir?

Herkes, GET parametrelerini (sorgu dizesi) okumak için kolay bir yol biliyor mu?

Bu benim işleyicisi nasıl gözüktüğü:

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

.. ve ana yönteme:

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

Kolay bir yol? URI'yi ayrıştır; Bu sadece bir istek. Mesajları işlemek zorunda kalırsanız, [bu] gibi şeyler (http://leonardom.wordpress.com/2009/08/06/getting-parameters-from-httpexchange/) yardımcı olabilir. –

cevap

26

aşağıdadır: httpExchange.getRequestURI().getQuery()

buna benzer formatta dize döndürür: "field1=value1&field2=value2&field3=value3..."

böylece basitçe çizgi ayrıştırma yapabilirsiniz

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

Ve bu nasıl kullanılacağını geçerli:: Kendini ng, bu ayrıştırma için fonksiyon gibi görünebilir nasıl

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

Bilinmesi gerekenler: Sorgu boş olabilir. Bunu kontrol etmelisin. – MinecraftShamrock

+5

Bu cevap için teşekkürler! Bununla birlikte, değeri bir ampersan içeren paramlar için başarısız olur. Düzeltmek için, 'getQuery()' yerine 'getRawQuery()' yi kullanın, daha sonra "&" üzerinde bölme sonrasında param = java.net.URLDecoder.decode (param, "UTF-8")). – Evan

+1

@Evan, Değerlerin haritaya yerleştirilmesinde kod çözmenin yapılması gerektiğine inanıyorum - bu şekilde bir '=' değeri varsa, bu değerlerin bir kısmını kaybetmezsiniz. –

0

Building Yanıta @ anon01 tarafından, bu bunu nasıl olduğunu 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]): ""] 
     } 
    } 
} 

Ve bu nasıl kullanılacağını geçerli:

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

Peki, teşekkürler. Ama soru Java için değil, Goovy değil;) – Tibor

1

Bu cevap, birnon01'in aksine, anahtarları ve değerleri doğru bir şekilde çözer. String.split'u kullanmaz, ancak daha hızlı olan indexOf kullanarak dizeyi tarar.

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