#java #android
Для отправки запросов на сервер пользовался httpurlconnection. На определённый адрес
отправлял пост запросы примерно такого вида act=GETCOMMENTS&connectid=... и т.д. И
всё вполне работало, приходил ответ от сервера и я его парсил. Но проблема возникла,
когда мне посредством этого запроса надо было отправить некий текст. А именно отправка
комментария, где в одном из ключей запроса пишется сам комментарий. Примерно так: &commenttext=test%20test2.
На сервер должно было это прийти именно в таком виде, а сервер сам производит замену
%20 на пробел. Но на сервер приходит именно test test2 с настоящим пробелом, а не %20,
а там настоящие пробелы обрезаются.
Вот код метода, который осуществляет все запросы:
private String serverRequester2 (String reqParam){
try {
URL url = new URL("http:/...определённыйСайт.../test.php");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("POST");
connection.setRequestProperty("USER-AGENT", "Mozilla/5.0");
connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
connection.setRequestProperty("Accept-Charset", "UTF-8");
connection.setDoOutput(true);
DataOutputStream dStream = new DataOutputStream(connection.getOutputStream());
dStream.writeBytes(reqParam);
Log.d("REQ_PARAM",reqParam);
dStream.flush();
dStream.close();
BufferedReader br = new BufferedReader(new InputStreamReader(connection.getInputStream()));
String line = "";
StringBuilder responseOutput = new StringBuilder();
while ((line=br.readLine())!=null){
Log.d("LINE",line);
responseOutput.append(line);
}
br.close();
return responseOutput.toString();
}
catch (MalformedURLException e) {
e.printStackTrace();
return null;
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
А вот так я его вызываю и передаю ему параметры, которые надо отправить на сервер:
return serverRequester2("act=CREATECOMMENT&connectid="+connectid+"&token="+token+"&clientcode=123123123&postid="+postID+"&commenttext=test%20test2");
Что я делаю не так? Почему отправляется настоящий пробел, вместо %20? Кстати знак
+ он тоже заменяет на пробел. А мне нужно, чтобы серверу пришло именно test%20test2
или test+test2, а не test test2.
P.S. сначала была мысль, что всё дело в сервере, но нет, с другого приложения написанного
другим человеком на Phonegap запрос приходит именно с URL кодировкой, а не с настоящим
пробелом.
Ответы
Ответ 1
Для отправки текста test%20test2 нужно передать test%2520test2, а для test+test2 нужно test%2btest2. Детальнее: https://en.wikipedia.org/wiki/Percent-encoding http://urlencode.org/ https://docs.oracle.com/javase/7/docs/api/java/net/URLEncoder.htmlОтвет 2
Все так и должно работать. %20 это и есть пробел, закодированный для передачи в параметре запроса. Если хотите, чтобы сервер получил %20 а не пробел, передавайте %2520, т.е. test%2520test2 в вашем примере. ADDON Возможно, если убрать это из заголовка connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); сервер перестанет декодировать параметры. Потому что именно он декодирует %20 в пробел, т.к. вы ему явно говрите, что отправляете закодированные данные.
Комментариев нет:
Отправить комментарий