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

Java. Delphi, idHttp. URLConnection. Post

22.01.2020, 17:51. Показов 2001. Ответов 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
2857 / 1364 / 407
Регистрация: 11.08.2017
Сообщений: 4,361
Записей в блоге: 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
2857 / 1364 / 407
Регистрация: 11.08.2017
Сообщений: 4,361
Записей в блоге: 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
2857 / 1364 / 407
Регистрация: 11.08.2017
Сообщений: 4,361
Записей в блоге: 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
2857 / 1364 / 407
Регистрация: 11.08.2017
Сообщений: 4,361
Записей в блоге: 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
2857 / 1364 / 407
Регистрация: 11.08.2017
Сообщений: 4,361
Записей в блоге: 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
2857 / 1364 / 407
Регистрация: 11.08.2017
Сообщений: 4,361
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru