Je voudrais avoir quelque chose à lire la chaîne de requête en tant que Multimap<String, String>
à une extrémité et quelque chose à écrire un Multimap<String, String>
en format de chaîne de requête sur l'autre. Ensuite, cela est aussi simple que d'appeler removeAll(parameter)
pour chaque paramètre que vous souhaitez supprimer de la chaîne de requête. Ne pas traiter avec quelque chose comme ça String
brut, sauf aux points où vous devez absolument.
est ici un code pour cela:
private static final Splitter QUERY_SPLITTER = Splitter.on(CharMatcher.anyOf("&;"));
private static final Joiner QUERY_JOINER = Joiner.on('&');
private static final EntrySplitFunction ENTRY_SPLITTER =
new EntrySplitFunction(Splitter.on('='));
private static final EntryJoinFunction ENTRY_JOINER =
new EntryJoinFunction(Joiner.on('=').useForNull(""));
public static Multimap<String, String> parseQueryString(String queryString) {
Multimap<String, String> result = HashMultimap.create();
Iterable<String> entryStrings = QUERY_SPLITTER.split(queryString);
for (Map.Entry<String, String> entry : transform(entryStrings, ENTRY_SPLITTER)) {
result.put(entry.getKey(), entry.getValue());
}
return result;
}
public static String toQueryString(Multimap<String, String> multimap) {
return QUERY_JOINER.join(transform(multimap.entries(), ENTRY_JOINER));
}
private static class EntrySplitFunction
implements Function<String, Map.Entry<String, String>> {
private final Splitter keyValueSplitter;
private EntrySplitFunction(Splitter keyValueSplitter) {
this.keyValueSplitter = keyValueSplitter;
}
@Override public Map.Entry<String, String> apply(String input) {
Iterator<String> keyAndValue = keyValueSplitter.split(input).iterator();
return Maps.immutableEntry(keyAndValue.next(), keyAndValue.next());
}
}
private static class EntryJoinFunction
implements Function<Map.Entry<String, String>, String> {
private final Joiner keyValueJoiner;
private EntryJoinFunction(Joiner keyValueJoiner) {
this.keyValueJoiner = keyValueJoiner;
}
@Override public String apply(Map.Entry<String, String> input) {
return keyValueJoiner.join(input.getKey(), input.getValue());
}
}
Avec cela, tout ce que vous auriez à faire pour mettre en œuvre votre méthode est la suivante:
public static String removeParameters(String queryString, String... parameters) {
Multimap<String, String> query = parseQueryString(queryString);
for (String parameter : parameters) {
query.removeAll(parameter);
}
return toQueryString(query);
}
Mieux encore, en supposant qu'il ya autre chose que vous faites avec la requête, vous auriez juste le Multimap
déjà quand vous atteignez le point que vous avez besoin de faire cela et vous ne même pas la peine d'écrire une méthode spéciale pour cela.
à propos de la dernière phrase: le cas d'utilisation est que la chaîne de requête doit être envoyée à un service externe qui a besoin apparemment quelques paramètres réservés supprimés. Je ne sais pas pourquoi, la question était pour un collègue. –