import java.net.URLDecoder;
import java.nio.charset.StandardCharsets;
import java.util.Map;
import java.util.HashMap;
import java.util.ArrayList;
import java.util.List;
public class QueryStringParserExample {
/**
* Parses and decodes a complete URL query string into a Map.
*
* @param queryString The URL query string (with or without leading '?').
* @return A Map where each key maps to a list of decoded values.
*/
public static Map<String, List<String>> parseAndDecodeQuery(String queryString) {
// Remove leading '?' if present
if (queryString != null && queryString.startsWith("?")) {
queryString = queryString.substring(1);
}
Map<String, List<String>> result = new HashMap<>();
if (queryString == null || queryString.isEmpty()) {
return result;
}
// Split query into individual key-value pairs
String[] pairs = queryString.split("&");
for (String pair : pairs) {
int idx = pair.indexOf("=");
try {
String key, value;
if (idx > 0) {
key = URLDecoder.decode(pair.substring(0, idx), StandardCharsets.UTF_8.name());
value = URLDecoder.decode(pair.substring(idx + 1), StandardCharsets.UTF_8.name());
} else {
key = URLDecoder.decode(pair, StandardCharsets.UTF_8.name());
value = "";
}
// Group values by key to handle multi-value parameters
result.computeIfAbsent(key, k -> new ArrayList<>()).add(value);
} catch (Exception e) {
System.err.println("Error decoding pair: " + pair);
}
}
return result;
}
public static void main(String[] args) {
String fullQuery = "search=java+tutorial&category=programming&tag=beginner&tag=backend";
System.out.println("--- Full Query String Parsing ---");
System.out.println("Original Query: " + fullQuery);
Map<String, List<String>> decodedMap = parseAndDecodeQuery(fullQuery);
System.out.println("Decoded Map Result:");
for (Map.Entry<String, List<String>> entry : decodedMap.entrySet()) {
System.out.println(" " + entry.getKey() + " -> " + entry.getValue());
}
}
}
/*
run:
--- Full Query String Parsing ---
Original Query: search=java+tutorial&category=programming&tag=beginner&tag=backend
Decoded Map Result:
search -> [java tutorial]
tag -> [beginner, backend]
category -> [programming]
*/