2013-03-04 3 views
5

Я хочу быть в состоянии пройти к моему серверу запрос GET Suh как:Как получить из параметров запроса как HashMap

http://example.com/?a[foo]=1&a[bar]=15&b=3 

И когда я получаю из параметров запроса «а», он должен быть проанализирован, как HashMap, как так:

{'foo':1, 'bar':15} 

EDIT: Хорошо, чтобы было понятно, вот то, что я пытаюсь сделать, но в Java, вместо PHP:

Pass array with keys via HTTP GET

Любые идеи, как это сделать?

ответ

1

Нет стандартного способа сделать это.

Поддержки поддержки javax.ws.rs.core.MultivaluedMap. Итак, если вы отправите что-то вроде http://example.com/?a=1&a=15&b=3, вы получите: ключ a значения 1, 15; ключ b значение 3.

Если вам нужно разобрать что-то вроде ?a[1]=1&a[gv]=15&b=3, вам нужно взять javax.ws.rs.core.MultivaluedMap.entrySet() и выполнить дополнительный синтаксический разбор ключей.

Вот пример кода, который вы можете использовать (не проверял, так что он может содержать некоторые незначительные ошибки):

String getArrayParameter(String key, String index, MultivaluedMap<String, String> queryParameters) { 
    for (Entry<String, List<String>> entry : queryParameters.entrySet()) { 
     String qKey = entry.getKey(); 
     int a = qKey.indexOf('['); 
     if (a < 0) { 
      // not an array parameter 
      continue; 
     } 
     int b = qKey.indexOf(']'); 
     if (b <= a) { 
      // not an array parameter 
      continue; 
     } 
     if (qKey.substring(0, a).equals(key)) { 
      if (qKey.substring(a + 1, b).equals(index)) { 
       return entry.getValue().get(0); 
      } 
     } 
    } 
    return null; 
} 

В вашем ресурсе вы должны назвать это так:

@GET 
public void getResource(@Context UriInfo uriInfo) { 
    MultivaluedMap<String, String> queryParameters = uriInfo.getQueryParameters(); 
    getArrayParameter("a", "foo", queryParameters); 
} 
+0

Это не то, что я хочу, потому что ключи также важны для меня. Поэтому, когда я получаю «a», я хочу, чтобы это значение было: {'1': 1, 'gv': 1} – Martin

+0

Ваш предложенный формат не является обычным форматом параметров запроса: вы смешиваете имя ключа с индексом. В любом случае вы можете получить keySet() с карты и проанализировать ее самостоятельно. – Tarlog

+0

Это была начальная идея - есть ли что-то, что я могу использовать, вместо того, чтобы разбирать ее самостоятельно :) – Martin

1

Вы можете передать объект JSON как String, добавив его в URL. Но Befor, что вам нужно закодировать его можно использовать метод, приведенный в этой ссылке http://www.salesforce.com/us/developer/docs/apexcode/Content/apex_classes_restful_encodingUtil.htm для кодирования, а затем просто добавить объект JSON, как и любой другой строка

+0

Моя проблема заключается не в создании URL-адреса, а в его анализе. – Martin

+0

Вы можете использовать любой из json-парсеров, доступных в виде GSON от Google ... –

0

В качестве альтернативы, если вы используете HttpServletRequest, то вы можете использовать getParameterMap() метод, который дает вам все параметры и его значения в виде карты.

например.

public void doGet(HttpServletRequest request, HttpServletResponse response) 
       throws IOException { 

    System.out.println("Parameters : \n"+request.getParameterMap()+"\n End"); 

} 
+0

Я не думаю, что вы понимаете, чего я хочу. Пожалуйста, прочитайте сообщение еще раз. Кроме того, связанный ответ, который я дал - реализация в PHP – Martin

+0

URL, который вы упоминаете, формируется вашим кодом, или вы его просто получаете? Как будто вы можете изменить создание URL как http://example.com/?foo=1&bar=15&b=3, а затем использовать вышеуказанный код, вы получите карту с ключами как foo, bar..etc и значения как 1, 15 ... и т. д. –

+0

Хорошо, но как я могу отличить, что foo и bar являются ключами 'a', а b нет? – Martin

Смежные вопросы