Подтвердить что ты не робот

Как передать несколько параметров в URL?

Я пытаюсь выяснить, как передать несколько параметров в URL. Я хочу передать широту и долготу из моего класса android в сервлет Java. Как я могу это сделать?

URL url;
double lat=touchedPoint.getLatitudeE6() / 1E6;
double lon=touchedPoint.getLongitudeE6() / 1E6;
url = new URL("http://10.0.2.2:8080/HelloServlet/PDRS?param1="+lat+lon);

В этом случае вывод (записанный в файл) равен 28.53438677.472097. Это работает, но я хочу передать широту и долготу в двух отдельных параметрах, чтобы уменьшить мою работу на стороне сервера. Если это невозможно, как я могу хотя бы добавить пробел между lat и lon, чтобы я мог использовать класс токенизатора, чтобы получить свою широту и долготу. Я пробовал следующую строку, но безрезультатно.

    url = new URL("http://10.0.2.2:8080/HelloServlet/PDRS?param1="+lat+" "+lon);
output- Nothing is written to file
        url = new URL("http://10.0.2.2:8080/HelloServlet/PDRS?param1="+lat+"&?param2="+lon);
output- 28.534386 (Only Latitude)
        url = new URL("http://10.0.2.2:8080/HelloServlet/PDRS?param1="+lat+"?param2="+lon);
output- 28.532577?param2=77.502996

Мой код сервлета выглядит следующим образом:

req.setCharacterEncoding("UTF-8");
resp.setCharacterEncoding("UTF-8");
final String par1 =  req.getParameter("param1");
final String par2 = req.getParameter("param2");
FileWriter fstream = new FileWriter("C:\\Users\\Hitchhiker\\Desktop\\out2.txt");
BufferedWriter out = new BufferedWriter(fstream);
out.write(par1);
out.append(par2);
out.close();

Также я хотел знать, что это самый безопасный и безопасный способ передачи данных с устройства Android на сервер.

4b9b3361

Ответ 1

Это

url = new URL("http://10.0.2.2:8080/HelloServlet/PDRS?param1="+lat+"&param2="+lon);

должен работать. По какой-то странной причине 1 вам нужно ? перед первым параметром и & перед следующими.

Используя составной параметр, например

url = new URL("http://10.0.2.2:8080/HelloServlet/PDRS?param1="+lat+"_"+lon);

тоже будет работать, но, безусловно, не очень приятно. Вы не можете использовать пробел там, где это запрещено в URL-адресе, но вы можете кодировать его как %20 или + (но это еще хуже).


1 Утверждение, что ? разделяет путь и параметры и что & разделяет параметры друг от друга, не объясняет ничего о причине. Некоторые RFC говорят "использовать там и там", но я не понимаю, почему они не выбрали один и тот же символ.

Ответ 2

Я мало разбираюсь в Java, но аргументы URL-адреса должны быть разделены символом "&", а не "?"

http://tools.ietf.org/html/rfc3986 является хорошим местом для ссылки, используя ключевое слово "sub-delim". http://en.wikipedia.org/wiki/Query_string - еще один хороший источник.

Ответ 3

Вы можете передать несколько параметров как "?param1=value1&param2=value2"

Но это не безопасно. Он уязвим для Cross Site Scripting (XSS) Attack.

Ваш параметр можно просто заменить на script.

Посмотрите на статью и article

Вы можете сделать это безопасным, используя API StringEscapeUtils

static String   escapeHtml(String str) 
          Escapes the characters in a String using HTML entities.

Даже использование https url для обеспечения безопасности без дополнительных мер предосторожности не является хорошей практикой.

Посмотрите на связанный вопрос SE:

Является ли URLEncoder.encode(строка, "UTF-8" ) плохая проверка?