Query String Manipulation в Java - PullRequest
       1

Query String Manipulation в Java

17 голосов
/ 09 ноября 2010

Кто-нибудь знает или знает java-класс, который я могу использовать для работы со строками запроса?

По сути, мне нужен класс, которому я могу просто дать строку запроса, а затем удалить, добавить и изменить строку запроса KVP.

Заранее спасибо.

EDIT

В ответ на комментарий к этому вопросу строка запроса будет выглядеть примерно так:

N=123+456+112&Ntt=koala&D=abc

Так что я бы хотел передать этому классу строку запроса и сказать что-то вроде:

String[] N = queryStringClass.getParameter("N");

а потом может быть

queryStringClass.setParameter("N", N);

и, возможно, queryStringClass.removeParameter("N");

Или что-то на этот счет.

Ответы [ 5 ]

16 голосов
/ 09 ноября 2010

ТАК, как это

 public static Map<String, String> getQueryMap(String query)  
 {  
     String[] params = query.split("&");  
     Map<String, String> map = new HashMap<String, String>();  
     for (String param : params)  
     {  
         String name = param.split("=")[0];  
         String value = param.split("=")[1];  
         map.put(name, value);  
     }  
     return map;  
 }  

Для итерации карты просто:

 String query = url.getQuery();  
 Map<String, String> map = getQueryMap(query);  
 Set<String> keys = map.keySet();  
 for (String key : keys)  
 {  
    System.out.println("Name=" + key);  
    System.out.println("Value=" + map.get(key));  
 }  
12 голосов
/ 19 августа 2014

Вы также можете использовать Google Guava's Splitter.

String queryString = "variableA=89&variableB=100";
Map<String,String> queryParameters = Splitter
    .on("&")
    .withKeyValueSeparator("=")
    .split(queryString);
System.out.println(queryParameters.get("variableA"));

распечатывает

89

Я думаю, что это очень удобная альтернатива анализу самостоятельно.

Редактировать: как указал @raulk, это решение не учитывает экранированные символы.Однако это может не быть проблемой, поскольку перед URL-декодированием строка запроса гарантированно не содержит экранированных символов, конфликтующих с «=» и «&».Вы можете использовать это в своих интересах следующим образом.

Скажите, что вы должны декодировать следующую строку запроса:

a=%26%23%25!)%23(%40!&b=%23%24(%40)%24%40%40))%24%23%5E*%26

, которая закодирована в URL, тогда вам гарантировано, что '&'и' = 'специально используются для отделения пар и ключа от значения, соответственно, в этот момент вы можете использовать разделитель Guava для получения:

a = %26%23%25!)%23(%40!
b = %23%24(%40)%24%40%40))%24%23%5E*%26

Как только вы получили пары ключ-значение, тогдаВы можете URL декодировать их отдельно.

a = &#%!)#(@!
b = #$(@)$@@))$#^*&

Это должно охватывать все случаи.

5 голосов
/ 09 ноября 2010

Если вы используете J2EE, вы можете использовать ServletRequest.getParameterValues ​​() .

В противном случае, я не думаю, что в Java есть какие-либо общие классы для обработки строки запроса. Написание собственного не должно быть слишком трудным, хотя есть некоторые сложные случаи, такие как осознание того, что технически один и тот же ключ может появляться в строке запроса несколько раз.

Одна реализация может выглядеть так:

import java.util.*;
import java.net.URLEncoder;
import java.net.URLDecoder;

public class QueryParams {
private static class KVP {
    final String key;
    final String value;
    KVP (String key, String value) {
        this.key = key;
        this.value = value;
    }
}

List<KVP> query = new ArrayList<KVP>();

public QueryParams(String queryString) {
    parse(queryString);
}

public QueryParams() {
}

public void addParam(String key, String value) {
    if (key == null || value == null)
        throw new NullPointerException("null parameter key or value");
    query.add(new KVP(key, value));
}

private void parse(String queryString) {
    for (String pair : queryString.split("&")) {
        int eq = pair.indexOf("=");
        if (eq < 0) {
            // key with no value
            addParam(URLDecoder.decode(pair), "");
        } else {
            // key=value
            String key = URLDecoder.decode(pair.substring(0, eq));
            String value = URLDecoder.decode(pair.substring(eq + 1));
            query.add(new KVP(key, value));
        }
    }
}

public String toQueryString() {
    StringBuilder sb = new StringBuilder();
    for (KVP kvp : query) {
        if (sb.length() > 0) {
            sb.append('&');
        }
        sb.append(URLEncoder.encode(kvp.key));
        if (!kvp.value.equals("")) {
            sb.append('=');
            sb.append(URLEncoder.encode(kvp.value));
        }
    }
    return sb.toString();
}

public String getParameter(String key) {
    for (KVP kvp : query) {
        if (kvp.key.equals(key)) {
            return kvp.value;
        }
    }
    return null;
}

public List<String> getParameterValues(String key) {
    List<String> list = new LinkedList<String>();
    for (KVP kvp : query) {
        if (kvp.key.equals(key)) {
            list.add(kvp.value);
        }
    }
    return list;
}

public static void main(String[] args) {
    QueryParams qp = new QueryParams("k1=v1&k2&k3=v3&k1=v4&k1&k5=hello+%22world");
    System.out.println("getParameter:");
    String[] keys = new String[] { "k1", "k2", "k3", "k5" };
    for (String key : keys) {
        System.out.println(key + ": " + qp.getParameter(key));
    }
    System.out.println("getParameters(k1): " + qp.getParameterValues("k1"));
}
}
1 голос
/ 08 сентября 2017

Другой способ - использовать http-компоненты apache. Это немного глупо, но, по крайней мере, вы используете все случаи разбора:

List<NameValuePair> params = 
    URLEncodedUtils.parse("http://example.com/?" + queryString, Charset.forName("UTF-8"));

Это даст вам список объектов NameValuePair, с которыми легко работать.

0 голосов
/ 09 ноября 2010

Вы можете создать метод util и использовать регулярное выражение для его анализа.Шаблон, подобный «[; &]» должен быть достаточным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...