#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 в пробел, т.к. вы ему явно говрите, что отправляете закодированные данные.
Комментариев нет:
Отправить комментарий