Как получить строку запроса в GET с помощью Java HttpServer/HttpExchange?
Я пытаюсь создать простой 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();
}
}
.. и основной метод:
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();
}
Ответы
Ответ 1
Следующее: httpExchange.getRequestURI().getQuery()
возвращает строку в формате, подобном этому: "field1=value1&field2=value2&field3=value3..."
чтобы вы могли просто разбирать строку самостоятельно, вот как может выглядеть функция для синтаксического анализа:
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"));
Ответ 2
Основываясь на ответе @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']
Ответ 3
Этот ответ, в отличие от 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;
}