Форум программистов, компьютерный форум, киберфорум
Java: Сети
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/9: Рейтинг темы: голосов - 9, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 16.08.2016
Сообщений: 14

Java. Delphi, idHttp. URLConnection. Post

22.01.2020, 17:51. Показов 1989. Ответов 12

Студворк — интернет-сервис помощи студентам
Всех приветствую. Вопрос в следующем. Нужно портировать функцию из Delphi в Java. Вроде все написал. Хотя, скорее всего, и не без огрехов. Но вопрос больше в том, что строчка:
Java
1
InputStreamReader LStream = new InputStreamReader(connection.getInputStream(), StandardCharsets.UTF_8);
приводит к вылету приложения. И самое непонятное - почему. Добавление исключения тоже результата не дает. Во первых, приложение, которое пишется и материал, на котором тестируется, должны отработать и это абсолютно точно. Потому что на Desktop версии все отрабатывает. А во вторых при добавление исключение приложение все равно вылетает (не знаю, как такое возможно, поэтому от части и спрашиваю).

Вопроса, как вы, уважаемые форумчане, поняли, 2:
1. Даст ли мне код на JAVA результат аналогичный коду на Delphi и если нет, то почему?
2. Что не так со строчкой InputStreamReader, почему она приводит к вылету приложения?

В Java относительно новый, просто рабочая задача стоит сделать из Desktop-приложения Android-приложение

Код на Delphi:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
function TFMain.SendHTTP(AURL, AParams: String): String;
var
  LStream: TStringStream;
begin
  LStream := TStringStream.Create(AParams, TEncoding.UTF8);
  try
    LStream.WriteString(AParams);
    LStream.Position := 0;
 
    if Assigned(IdHTTP) then
      with IdHTTP do
      begin
        with Request do
        begin
          Clear;
          BasicAuthentication := true;
          Username := '123'; // Логин API
          Password := '12345678'; // Пароль API
          ContentType := 'application/x-www-form-urlencoded';
          AcceptCharSet := 'utf-8';
        end;
 
        try
          result := (Post(AURL, LStream));
        except
          on e: exception do
            result := e.Message
        end;
      end;
  finally
    LStream.Free;
  end;
end;
Код на JAVA. Версия 1:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
@RequiresApi(api = Build.VERSION_CODES.O)
    public static String SendHTTP(String AURL, String AParams) throws IOException {
        String result = "";
 
        //StringWriter LStream1 = (StringWriter) Stream.of(decodeValue(AParams));
        try {
            URLConnection connection = new URL(AURL).openConnection();
            connection.setRequestProperty("Authorization", "Basic "+ ENCODING);
            connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
            connection.setRequestProperty("username", "123");
            connection.setRequestProperty("password", "12345678");
            connection.setRequestProperty("AcceptCharSet", "utf-8");
            connection.setReadTimeout(20000);
            connection.setConnectTimeout(20000);
            connection.setDoInput(true);
            connection.setDoOutput(true);
            //InputStreamReader LStream = new InputStreamReader(connection.getInputStream(), StandardCharsets.UTF_8);
            //BufferedReader reader = new BufferedReader(connection.getInputStream());
            //OutputStreamWriter LStream = new OutputStreamWriter(connection.getOutputStream(), StandardCharsets.UTF_8);
            //result = IOUtils.toString(LStream);
        }
        catch (Exception e)
        {
            result = e.getMessage();
        }
        return result;
    }
Код на JAVA, версия 2:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
    @RequiresApi(api = Build.VERSION_CODES.O)
    public static String SendHTTP(String AURL, String AParams) throws IOException {
 
        HttpURLConnection connection = (HttpURLConnection) new URL(AURL).openConnection();
        connection.setRequestProperty("Authorization", "Basic "+ ENCODING);
        connection.setRequestProperty("username", "123");
        connection.setRequestProperty("password", "12345678");
        connection.setRequestProperty("ContentType", "application/x-www-form-urlencoded");
        connection.setRequestProperty("AcceptCharSet", "utf-8");
        connection.setConnectTimeout(10000);
        connection.setDoOutput(true);
        
 
        try (OutputStreamWriter TempResult = new OutputStreamWriter(connection.getOutputStream())) {
            TempResult.write(AParams);
        }
 
        if (connection.getResponseCode() != 200) {
            System.err.println("Connection Failed!");
            return Optional.empty();
        }
 
        try (BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream(), Charset.forName("utf-8")))) {
                      return Optional.of(reader.lines().collect(Collectors.joining(System.lineSeparator())));
         }
    }
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
22.01.2020, 17:51
Ответы с готовыми решениями:

Android. Java. Delphi, idHttp. URLConnection. Post
Всем привет. Вопрос в следующем: https://www.cyberforum.ru/java-networks/thread2573782.html#post14194665 в этой теме был задан мной вопрос,...

IdHttp::Post()
Люди, хелп! пытаюсь зарегится на сайте с помощью IdHttp->Post()....сервер идет в отказ, думаю дело в кукиксах корорые я .. подключил....

idHTTP.post
в строке HTTP.Post('http://www.google.com.ua/search'); http://www.google.com.ua/search ето клавиша в гугле "поиск в гугле" ...

12
Модератор
Эксперт Java
 Аватар для alecss131
2839 / 1348 / 403
Регистрация: 11.08.2017
Сообщений: 4,303
Записей в блоге: 2
22.01.2020, 18:32
Ну вообще для андроида есть отдельный раздел. Отвечу в силу своих знаний соединений.
Второй вариант выглядит лучше. С каким исключением вылетает? IO достаточно широкий класс. И getMessage замените на printStackTrace или как то так. Сейчас про первый вариант. Я смотрю у вас пост запрос. Так вот, передавать данные для пост надо до получения кода ответа или инпутстрима, так как после его можно читать. setDoInput не нужен совсем, а setDoOutput только для пост, для гет не нужно, для пост еще тип задайте connection.setRequestType("POST"); (вроде так, добуквенно не помню). И попробуйте использовать Http(s)URLConnection вместо просто УРЛ. Соединение надо закрывать после завершения. Вариант отправки данных для поста connection.getOutputStream().write(aPara ms.getBytes("UTF-8"));
1
0 / 0 / 0
Регистрация: 16.08.2016
Сообщений: 14
23.01.2020, 11:40  [ТС]
alecss131, немного поправил первую версию согласно вашим рекомендациям. Получилось следующее:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
    @RequiresApi(api = Build.VERSION_CODES.O)
    public static String SendHTTP(String AURL, String AParams) throws IOException {
        String result = "";
 
        try {
            HttpsURLConnection connection = (HttpsURLConnection) new URL(AURL).openConnection();
            connection.setRequestProperty("Authorization", "Basic "+ ENCODING);
            connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
            connection.setRequestProperty("username", "123");
            connection.setRequestProperty("password", "12345678");
            connection.setRequestProperty("AcceptCharSet", "utf-8");
            connection.setRequestMethod("POST");
            connection.setReadTimeout(20000);
            connection.setConnectTimeout(20000);
            connection.setDoOutput(true);
            connection.getOutputStream().write(AParams.getBytes("UTF-8"));
            result = AParams;
        }
        catch (Exception e)
        {
            result = e.getMessage();
        }
        return result;
    }
Вылетает приложение на строке:
Java
1
connection.getOutputStream().write(AParams.getBytes("UTF-8"))
Лог я, честно говоря, не очень понимаю, как отследить, потому что тестирую сразу на телефоне, так как эмуляторы лагают непомерно на рабочей машине.

Комментирование строки решает вылет приложения, но результат я, естественно, не получаю. Хоть убейте, не понимаю, что с ней не так
0
Модератор
Эксперт Java
 Аватар для alecss131
2839 / 1348 / 403
Регистрация: 11.08.2017
Сообщений: 4,303
Записей в блоге: 2
23.01.2020, 12:13
А что Вы (именно Вы) подразумеваете под переменной AParams? Просто в коде подразумевается что это входные данные для запроса, ведь это входной параметр метода. Для получения ответа надо использовать не OutputStream соединения а InputStream.
У меня на компе вот этот код отрабатывает без ошибок. Только стоит добавить проверку на null при вызове данного метода
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
public static String SendHTTP(String AURL, String AParams) {
            try {
                HttpsURLConnection connection = (HttpsURLConnection) new URL(AURL).openConnection();
                connection.setRequestProperty("Authorization", "Basic "+ ENCODING);
                connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
                connection.setRequestProperty("username", "123");
                connection.setRequestProperty("password", "12345678");
                connection.setRequestProperty("AcceptCharSet", "utf-8");
                connection.setRequestMethod("POST");
                connection.setReadTimeout(20000);
                connection.setConnectTimeout(20000);
                connection.setDoOutput(true);
                byte data[] = AParams.getBytes("UTF-8");
                connection.getOutputStream().write(data);
                connection.setRequestProperty("Content-Length", "" + data.length);
                int code = connection.getResponseCode();
                if (code == 200) {
                    return getString(connection.getInputStream());
                } else {
                    System.out.println("Error. Server response: " + code);
                    return null;
                }
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        return null;
    }
    private static String getString(InputStream is) throws IOException {
        StringBuilder textBuilder = new StringBuilder();
        try (Reader reader = new BufferedReader(new InputStreamReader(is, "UTF-8"))) {
            int c = 0;
            while ((c = reader.read()) != -1) {
                textBuilder.append((char) c);
            }
        }
        return textBuilder.toString();
    }
Мне почему то кажется что вы пытаетесь через AParams получить ответ...
Вот пример использования.
Java
1
2
3
4
public static void main(String[] args) {
        String tst = SendHTTP("адрес сайта", "параметры запроса, то есть тело запроса"); //tst - то что возвращает сервер в теле ответа
        System.out.println(tst);
    }
1
0 / 0 / 0
Регистрация: 16.08.2016
Сообщений: 14
23.01.2020, 15:22  [ТС]
alecss131, теперь все выглядит интереснее. Приложение не выкидывает, но ответ получает с ошибкой. Покопавшись встал следующий вопрос. AParams - не пустой и можно ли без кодировок в bytes Data отправлять запрос на сайт?

Грубо говоря. SendHTTP все параметры перекидывает на AParams и вот можно ли AParams без вот этого:
Java
1
byte data[] = AParams.getBytes("UTF-8");
отправить запросом?
0
Модератор
Эксперт Java
 Аватар для alecss131
2839 / 1348 / 403
Регистрация: 11.08.2017
Сообщений: 4,303
Записей в блоге: 2
23.01.2020, 16:03
Если в AParams будут не юникод символы (чтото помимо англ букв и цифр со спец символами) то без указания кодировки сервер получит кашу.
Можно так сделать:
Java
1
byte data[] = AParams.getBytes();
Тогда вот эти строчки под снос тоже будут
Java
1
2
} catch (UnsupportedEncodingException e) {
                e.printStackTrace();
Судя по заголовкам вы просите в ответ utf-8 а сами не хотите посылать в этом формате. Мне почему то кажется могут быть ошибки в других местах, кодировка не виновата. Какой код ответа приходит? В зависимости от него надо смотреть дальше.
Если нету исключений то ошибка определенно в способе авторизации, структура кода отработана не раз, работает к примеру с яндекс метрикой и яндекс переводчиком, с другими апи на этом форуме не помогал никому.
0
0 / 0 / 0
Регистрация: 16.08.2016
Сообщений: 14
23.01.2020, 16:06  [ТС]
alecss131, ответ приходит даже не null, а просто пустой. при этом AParams содержит явный спектр параметров, но я так понимаю, что после кодировки в byte сервер получает не то, что ожидает увидеть.

В случае с делфи, если конечно idHttp Post чего то не мудрит, сервер получает параметры AParams.

По крайней мере здесь я не вижу кодировки в Byte:
Delphi
1
2
3
4
5
6
7
8
9
function TIdCustomHTTP.Post(AURL: string; ASource: TIdMultiPartFormDataStream
  {$IFDEF STRING_IS_ANSI}; A******coding: IIdTextEncoding = nil{$ENDIF}
): string;
begin
  Assert(ASource<>nil);
  Request.ContentType := ASource.RequestContentType;
                                                     
  Result := Post(AURL, TStream(ASource){$IFDEF STRING_IS_ANSI}, A******coding{$ENDIF});
end;
0
Модератор
Эксперт Java
 Аватар для alecss131
2839 / 1348 / 403
Регистрация: 11.08.2017
Сообщений: 4,303
Записей в блоге: 2
23.01.2020, 16:55
Попробуйте тогда другой метод получения строки из потока
Java
1
2
3
4
5
6
7
8
9
private static String getString(InputStream is) throws IOException {
        ByteArrayOutputStream result = new ByteArrayOutputStream();
        byte[] buffer = new byte[1024];
        int length;
        while ((length = is.read(buffer)) != -1) {
            result.write(buffer, 0, length);
        }
        return result.toString("UTF-8");
    }
Хотя у меня и прошлый работает норм.
А как вы себе еще представляете способ передачи строки без преобразовывания в байты? Тут скорее не кодировка а преобразование строки в байты. И изза этого проблем быть не может.
А что у вас за апи? Может так станет яснее.
1
0 / 0 / 0
Регистрация: 16.08.2016
Сообщений: 14
23.01.2020, 17:35  [ТС]
alecss131, этот вариант тоже не сработал

По вопросу АПИ смогу сориентировать завтра, программист, ответственный за сайт, ушел уже

Добавлено через 29 минут
alecss131, а передачи строки регламентирована какой-то длиной символов? строка AParams имеет длину 138 символов. Byte - если этот byte имеет размерность от -128 до 127. Но вдруг есть тут затык
0
Модератор
Эксперт Java
 Аватар для alecss131
2839 / 1348 / 403
Регистрация: 11.08.2017
Сообщений: 4,303
Записей в блоге: 2
23.01.2020, 18:03
Там берутся байты из символов строки и если используется кодировка к примеру utf-8 то байты будут в этой кодировке и все программы понимающие юникод поймут эти байты. Тип байт имеет размер 1 байт. А то что тип байт еще и числа от -127 до 128 тут не важно. Да и там же массив байт будет. Еще как понимаю в заголовке content-length длинна тела запроса как раз в байтах а не символах, и длинна строки в байтах не всегда равна длинне в символах. data[] это как раз массив длинны которой ему присвоят.
Если есть доступ к сайту то можете глянуть то что от вас приходит. Можете попробовать поставить декстопный jdk на комп и подебажить метод на нем. Единственное что мне кажется что это могут быть особенности андроида. Можете сразу а можете после проверки на компе в джаве. А вообще на этом форуме есть раздел для андроида и там джава тоже. Вы немного разделом ошиблись. Хотя по сути язык один и вряд ли так сильно различаются.
1
0 / 0 / 0
Регистрация: 16.08.2016
Сообщений: 14
24.01.2020, 09:38  [ТС]
alecss131, и, все-таки, пока не пересоздал вопрос на форуме - информация получилась следующая:

Ответ к сайту либо не доходит, либо доходит, но ответ не декодируется. Решил вывести информацию по code и получил следующее: он не равен 200, переменная, в которую пытаюсь записать - показывает 0. Отследил момент, до какой строки доходим и почему 0 - получил следующее: После этой строки
Java
1
connection.getOutputStream().write(dataParams);
вылетает исключение.

Я могу попробовать бросить 3 функции, которые мне нужно, чтобы отработали, в отдельное java - пк-приложение и посмотреть, будет ли тоже самое или это особенность андроида. Но сам факт, что почему то после этой строчки - исключение.

На телефоне именно я не могу его проследить. Поля исключений на телефоне в приложении не отображаются
0
Модератор
Эксперт Java
 Аватар для alecss131
2839 / 1348 / 403
Регистрация: 11.08.2017
Сообщений: 4,303
Записей в блоге: 2
24.01.2020, 10:07
Странно, у меня на компе отрабатывает без проблем и так, пост на мой сервак проходит. Куда еще можно пост сделать не знаю поэтому пробовал на свой)))
Еще заметил что везде пишу немного иначе. Сначала идет setDoOutput потом setRequestType потом все заголовки, включая длинну а только в конце (перед кодом ответа) пишу в OutputStream. Строку в массив байт не важно когда, главное знать размер массива до указания заголовка и иметь массив до записи его в запрос.
То есть в моем примере по строчкам 12,9,4-8,15 а 14 перед 16. И зачем такое долгое ожидание? Там стандартный таймаут вроде чтото около 10с, в любом случае (если сервак не как мой после 30мин неактивности засыпает и первое обращение после засыпания может длиться секунд 10-15) можно не трогать таймауты.
Если не поможет то значит особенности андроида, я немного поизучал андроид и удивился что его нативные программы на джаве, правда вм у него своя. Если будете на компе пробовать то выше 8 не стоит брать (чем выше тем больше костылей при переходе на андроид как понял).
1
0 / 0 / 0
Регистрация: 16.08.2016
Сообщений: 14
24.01.2020, 11:05  [ТС]
alecss131, пересобрал проект на пк. Все отработало без проблем. Интересное кино Ладно, тогда прыгаем в тему с Android`ом, ахаха
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
24.01.2020, 11:05
Помогаю со студенческими работами здесь

IdHTTP (POST запрос)
Здравствуйте,есть такой вопрос,при отправке POST запроса в ответ получаю ошибку HTTP/1.1 302 Found, это меня устраивает,вопрос состоит в...

Idhttp json post
Всем привет! Хочу с определенного сайта &quot;выдернуть&quot; инфу. на основном сервере авторизацию прога проходит. но для того чтобы посмотреть...

IdHTTP Post запросы
Делаю прогу для накрутки просмотров на YouTube, как реализовать множество Post запросов ? И на определенную ссылку ? Просьба тапками...

Перехват исключения IdHTTP (post)
Всем привет. При попытке поставить try catch на idhttpd-&gt;post программа вылетает, даже если исключения нет. Делаю так: try { ...

idhttp post 500-й еррор
пробую авторизоваться на сайте, но мне каждый раз бьет 500-й еррор, в чем может быть трабла...? function Pars(T_, ForS, _T: string):...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru