Страницы

Поиск по вопросам

суббота, 21 декабря 2019 г.

При отправке POST запроса при помощи httpurlconnection %20 заменяются на пробелы

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

Комментариев нет:

Отправить комментарий