web-dev-qa-db-ja.com

Java HttpServer / HttpExchangeを使用してGETでクエリ文字列を取得する方法は?

単純なHttpServerをJava=で作成して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();
  } 
}

..そしてmainメソッド:

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

以下: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;
}

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

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

この回答は、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;
}
1
Oliv

@ 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']
1
Wim Deblauwe