2012-07-24 5 views
13

私は、GETリクエストを処理するためにJavaで単純なHttpServerを作成しようとしていますが、 リクエストに対してGETパラメータを取得しようとすると、HttpExchangeクラスにはメソッドがありません。Java HttpServer/HttpExchangeを使用してGETでクエリ文字列を取得する方法は?

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

...と主な方法:

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

簡単な方法はありますか? URIを解析する。それはただのリクエストです。投稿を処理する必要がある場合、[this](http://leonardom.wordpress.com/2009/08/06/getting-parameters-from-httpexchange/)のようなものが役に立ちます。 –

答えて

26

は以下:httpExchange.getRequestURI().getQuery()

は、このような形式の文字列を返します。 "field1=value1&field2=value2&field3=value3..."

だから、単にストライドを解析できる解析のための機能がどのように見える可能性がどのように自分自身をngの、これはされています

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

そして、これは、あなたがそれを使用することができる方法である:

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

重要なこと:クエリはnullでもかまいません。それを確認する必要があります。 – MinecraftShamrock

+5

この回答ありがとうございます!しかし、値にアンパサンドが含まれるparamsでは失敗します。これを修正するには、 'getQuery()'の代わりに 'getRawQuery()'を使い、 '&"を分割して 'param = java.net.URLDecoder.decode(param、" UTF-8 ")'を使います。 – Evan

+1

@エヴァン、私はデコードがマップに値を入れるときに起こると信じています - その中に '='があると値の一部を失うことはありません。 –

0

@ anon01で、これはそれを行う方法であります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]): ""] 
     } 
    } 
} 

そして、これはそれを使用する方法である:

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

ありがとうございます。しかし、問題はGoovyではなくJavaに対するものです) – Tibor

1

この回答は、annon01とは異なり、キーと値を適切にデコードします。 String.splitは使用しませんが、より高速のindexOfを使用して文字列をスキャンします。

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; 
} 
関連する問題