0 / 0 / 0
Регистрация: 24.10.2016
Сообщений: 10

Synapse Delphi XE5 под мобильные приложения

04.06.2017, 06:29. Показов 4184. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!
Пишу мобильное приложение на Delphi XE5. Indy использую очень редко, в основном пользуюсь synapse. У меня в потоке отправляются post и get запросы, для этого я использую synapse. Дело в том, что приложение я почти дописал и при отладке в windows всё работает. Но когда я компилирую проект под Android, Delphi XE5 мне постоянно говорит, что synapse не найден. Использовал имеющийся у меня synapse, скачивал несколько разных версий - не хочет компилировать. Прошу направить меня в нужную сторону, переписывать проект под Indy очень не хочется.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
04.06.2017, 06:29
Ответы с готовыми решениями:

Разработка под iOS Delphi XE5
Ребят, нужен ли сертификат программе разработанной в делфи ? Как его обойти? Можно ли после компиляции сразу закачать на iPhone и...

О работе приложения Text Layout Demo из дистрибутива Delphi XE5
Здравствуйте! Вопрос касается работы приложения Text Layout Demo из примеров, прилагаемых к Delphi XE5 (Documents\RAD...

Не увеличивается ширина ProgressBar'a (Delphi XE5 разработка под Android)
Не получается увеличить ширину ПрогрессБара в Delphi XE5 при разработке под Android, однако при создании приложения для компа все...

16
 Аватар для krapotkin
6847 / 4674 / 1463
Регистрация: 14.04.2014
Сообщений: 20,653
Записей в блоге: 21
04.06.2017, 08:09
если вы планируете писать под мобилы, то вам нужна версия не ниже Seattle и не выше (на тек. момент) Berlin Upd 2
так что уже тут вас ждет разочарование
а в указанных версиях есть родной нативный THttpClient, на который и нужно все переписать
это несложно
1
0 / 0 / 0
Регистрация: 24.10.2016
Сообщений: 10
04.06.2017, 22:22  [ТС]
Спасибо за ответ. Все говорят, что это очень глючный и тяжёлый компонент, особенно при использовании его в потоке, по этому мне не хотелось его использовать. Ну раз сказали, придётся переписывать. Когда закончу, возможно отпишусь.
0
 Аватар для krapotkin
6847 / 4674 / 1463
Регистрация: 14.04.2014
Сообщений: 20,653
Записей в блоге: 21
05.06.2017, 06:59
прямо интересно стало, о каком компоненте идет речь?
1
0 / 0 / 0
Регистрация: 24.10.2016
Сообщений: 10
05.06.2017, 23:52  [ТС]
И в правду, я с чего взял, что речь идёт о TIdHTTP. Даже уже переписал весь проект под него и у меня возникла проблема с ssl на android. Сейчас чуть-чуть одумался, установил Delphi XE8 и стал переписывать используя THttpClient. И меня появилась новая проблема, я не знаю, как добавить свои заголовки, например "X-Requested-With: XMLHttpRequest". Не подскажите?
0
 Аватар для krapotkin
6847 / 4674 / 1463
Регистрация: 14.04.2014
Сообщений: 20,653
Записей в блоге: 21
06.06.2017, 00:05
вот ровно так же как везде 1:1
ищем свойство которое содержит слово Headers и туда пихаем
и еще раз повторю
до 10.0 и после 10.1 никакой мобильной разработки нет...
1
0 / 0 / 0
Регистрация: 24.10.2016
Сообщений: 10
06.06.2017, 11:16  [ТС]
Спасибо, установил Delphi 10, почти всё работает. Почему-то не удаётся изменить Content Type при запросе. Изменяю так:
"HTTPClient.ContentType := 'application/json';", а он как был "application/x-www-form-urlencoded; charset=UTF-8", так и остаётся.
Проверяю этой программой - "http analyzer". Может я не правильно задаю ContentType или здесь есть свои хитрости?
0
 Аватар для krapotkin
6847 / 4674 / 1463
Регистрация: 14.04.2014
Сообщений: 20,653
Записей в блоге: 21
06.06.2017, 12:38
всегда есть хитрости.
нужно трассировать в отладчике сам вызов Get или Post, и смотреть, где переустанавливается значение ContentType
исходники же в наличии
Может, нужно httpClient.Request.ContentType ?
наизусть не скажу
1
0 / 0 / 0
Регистрация: 24.10.2016
Сообщений: 10
06.06.2017, 17:28  [ТС]
Ну, не знаю. Не удаётся мне Content Type изменить.
Использую примерно такой код:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
procedure ThomeForm.Button1Click(Sender: TObject);
var data: TStringList;
      H:THTTPClient;
begin
  data := TStringList.Create;
  data.Add('{"phone":"' + HomeForm.Phone.Text + '"}');
 
  h := THTTPClient.Create;
 
  h.ContentType := 'application/json';
  h.Accept := 'application/json, text/plain, */*';
 
  log.Text := h.Post('https://site.ru/api/phone', data).ContentAsString();
end;
0
 Аватар для krapotkin
6847 / 4674 / 1463
Регистрация: 14.04.2014
Сообщений: 20,653
Записей в блоге: 21
06.06.2017, 21:31
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
procedure TfMain.FormCreate(Sender: TObject);
var
  h:THTTPClient;
  res:TStringStream;
  sl:TStringList;
begin
  h:=THTTPClient.Create;
  sl:=TStringList.Create;
  res:=TStringStream.Create('',TEncoding.UTF8);
  try
    h.ContentType:='application/json';
    h.AcceptCharSet:='UTF-8';
    sl.Values['q']:='{"action":"killThemAll","time":"now"}';
    h.Post('http://autoskating.ru/tmp.php',SL,res);
    m1.Lines.Text := res.DataString;
  finally
    sl.Free;
    res.Free;
    h.Free;
  end;
end;
PHP
1
2
3
<?php
print_r($_REQUEST);
echo "\r\n"."Русский текст UTF-8";
2
0 / 0 / 0
Регистрация: 24.10.2016
Сообщений: 10
08.06.2017, 21:09  [ТС]
Спасибо за пример кода, но Content Type не изменяется. Может во мне проблема?
Миниатюры
Synapse Delphi XE5 под мобильные приложения  
0
 Аватар для krapotkin
6847 / 4674 / 1463
Регистрация: 14.04.2014
Сообщений: 20,653
Записей в блоге: 21
08.06.2017, 21:35
определенно))
чуть изменим коды
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
procedure TfMain.FormCreate(Sender: TObject);
var
  h:THTTPClient;
  res:TStringStream;
  sl:TStringList;
  resp : IHTTPResponse;
  i:integer;
begin
  h:=THTTPClient.Create;
  sl:=TStringList.Create;
  res:=TStringStream.Create('',TEncoding.UTF8);
  try
    h.ContentType:='application/json';
    h.AcceptCharSet:='UTF-8';
    sl.Values['q']:='{"action":"killThemAll","time":"now"}';
    resp := h.Post('http://autoskating.ru/tmp.php',SL,res);
    for i := 0 to High(resp.Headers) do
      m1.Lines.Add( resp.Headers[i].Name+': '+resp.Headers[i].Value);
    m1.Lines.Add('-------------');
    m1.Lines.Add(resp.ContentAsString(TEncoding.UTF8));
 
  finally
    sl.Free;
    res.Free;
    h.Free;
  end;
end;
PHP
1
2
3
<?php
header('Content-Type:application/json; charset=UTF-8');
echo '{"result":"done"}';
1
0 / 0 / 0
Регистрация: 24.10.2016
Сообщений: 10
09.06.2017, 11:11  [ТС]
Я в php не селён, но используя:
PHP
1
2
<?php
header('Content-Type:application/json; charset=UTF-8');
Вы ставите "Content-Type:application/json;" на серверной стороне.
И используя этот код:
Delphi
1
2
  for i := 0 to High(resp.Headers) do
      m1.Lines.Add( resp.Headers[i].Name+': '+resp.Headers[i].Value);
Вы лишь выводите ответ, который Вам дал сервер. А если вы на сервере потавили
PHP
1
header('Content-Type:application/json; charset=UTF-8');
, то ответ вы получите именно в таком формате.
И по этому, даже если вы в делфи укажите такой Content-Type:

Delphi
1
h.ContentType:='asdgasdgagadgafadfgn';
, то ответ получте всё равно с "Content-Type:application/json;"
Я посмотрел в программе http analyzer, какие заголовки отправляет делфи, и он всё равно отправлял "Content-Type: application/x-www-form-urlencoded; charset=UTF-8"
Миниатюры
Synapse Delphi XE5 под мобильные приложения  
0
 Аватар для krapotkin
6847 / 4674 / 1463
Регистрация: 14.04.2014
Сообщений: 20,653
Записей в блоге: 21
09.06.2017, 12:28
вообще, сервер должен анализировать заголовок и отправлять данные в запрошенном формате
если умеет/хочет
если сервер точно уверен, что должен вернуть json, можно ничего не разбирать и просто приделать нужный заголовок, как я и сделал сейчас

по поводу что за заголовки отправляет делфи, нужно действительно покопаться в коде. нет пока возможности
1
 Аватар для krapotkin
6847 / 4674 / 1463
Регистрация: 14.04.2014
Сообщений: 20,653
Записей в блоге: 21
10.06.2017, 21:06
Лучший ответ Сообщение было отмечено zolotarevsky как решение

Решение

смотрим в код
немного смеёмся ))
они вообще не используют введенные заголовки ))))
но если вызывать вот этот метод пост
Delphi
1
function THTTPClient.Post(const AURL: string; const ASource, AResponseContent: TStream; const AHeaders: TNetHeaders): IHTTPResponse;
то можно передать параметр AHeaders

итого сделал вот так:
Кликните здесь для просмотра всего текста
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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
unit UMainForm;
 
interface
 
uses
  System.SysUtils, fmx.forms, System.Classes, FMX.Types, FMX.Controls, FMX.StdCtrls,
  FMX.Objects, FMX.ListBox, FMX.Layouts, IdBaseComponent, IdComponent,
  IdTCPConnection, IdTCPClient, IdExplicitTLSClientServerBase, IdMessageClient,
  IdSMTPBase, IdSMTP, FMX.Menus, System.Rtti, FMX.Grid.Style, FMX.Grid,
  System.ImageList, FMX.ImgList, FMX.Controls.Presentation, FMX.ScrollBox,
  FMX.Dialogs, FMX.Memo;
 
type
  TfMain = class(TForm)
    m1: TMemo;
    procedure FormCreate(Sender: TObject);
  private
  public
  end;
 
 
 
var
  fMain: TfMain;
 
 
implementation
 
uses
  System.Net.HttpClient, System.Net.URLClient;
 
{$R *.fmx}
 
 
 
procedure TfMain.FormCreate(Sender: TObject);
var
  h:THTTPClient;
  src,res:TStringStream;
  sl:TStringList;
  resp : IHTTPResponse;
  i:integer;
  headers:TNetHeaders;
begin
  h:=THTTPClient.Create;
  sl:=TStringList.Create;
  res:=TStringStream.Create('',TEncoding.UTF8);
  src:=TStringStream.Create('',TEncoding.UTF8);
  try
    h.ContentType:='application/json';
    h.AcceptCharSet:='UTF-8';
    sl.Values['q']:='{"action":"killThemAll","time":"now"}';
    SetLength(headers,1);
    headers[0].Name := 'Content-Type';
    headers[0].Value := 'application/json; charset=utf-8';
    src.WriteString(sl.Text);
    resp := h.Post('http://autoskating.ru/tmp.php',src,res,headers);
    for i := 0 to High(resp.Headers) do
      m1.Lines.Add( resp.Headers[i].Name+': '+resp.Headers[i].Value);
    m1.Lines.Add('-------------');
    m1.Lines.Add(resp.ContentAsString(TEncoding.UTF8));
 
  finally
    sl.Free;
    src.Free;
    res.Free;
    h.Free;
  end;
end;
 
end.


Кликните здесь для просмотра всего текста
PHP
1
2
3
4
<?php
foreach (getallheaders() as $name => $value) {
    echo "$name: $value\n";
}


результат
Миниатюры
Synapse Delphi XE5 под мобильные приложения  
1
0 / 0 / 0
Регистрация: 24.10.2016
Сообщений: 10
13.06.2017, 11:53  [ТС]
Спасибо, за приведенный код, но всё оказалось на много проще.
Обратился я к форуму stackoverflow и мне там сказали:

У HttpClient есть 4 перегруженных (overload) Post метода:

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
// Post a raw file without multipart info
function Post(
  const AURL: string; 
  const ASourceFile: string; 
  const AResponseContent: TStream = nil; 
  const AHeaders: TNetHeaders = nil
): IHTTPResponse; overload;
 
// Post TStrings values adding multipart info
function Post(
   const AURL: string; 
   const ASource: TStrings; 
   const AResponseContent: TStream = nil; 
   const AEncoding: TEncoding = nil; 
   const AHeaders: TNetHeaders = nil
): IHTTPResponse; overload;
 
// Post a stream without multipart info
function Post(
   const AURL: string; 
   const ASource: TStream; 
   const AResponseContent: TStream = nil;
   const AHeaders: TNetHeaders = nil
): IHTTPResponse; overload;
 
// Post a multipart form data object
function Post(
   const AURL: string; 
   const ASource: TMultipartFormData; 
   const AResponseContent: TStream = nil;
   const AHeaders: TNetHeaders = nil
): IHTTPResponse; overload;
Первый и третий методы отправляют данные как есть, второй метод (которым вы воспользовались) отправляет данные как application/x-www-form-urlencoded, четвёртый метод отправляет данные как multipart/form-data.

Таким образом, вам нужно использовать первый или третий метод, если вы хотите отправлять сырые данные с указанием своего Content-Type.

Пример, с использованием третьего метода:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
var
  data: TStringStream;
  H: THTTPClient;
begin
  data := TStringStream.Create;
  try
    data.WriteString('{"phone":"' + HomeForm.Phone.Text + '"}');
 
    h := THTTPClient.Create;
    try      
      h.ContentType := 'application/json';
      h.Accept := 'application/json, text/plain, */*';    
      log.Text := h.Post('https://site.ru/api/phone', data).ContentAsString();
    finally
      h.Free;
    end;
  finally
    data.Free;
  end;
end;
0
 Аватар для krapotkin
6847 / 4674 / 1463
Регистрация: 14.04.2014
Сообщений: 20,653
Записей в блоге: 21
13.06.2017, 15:17
ну я это и написал собственно
нужно использовать Post(url, stream, stream, headers)
но это совсем не очевидно
данные "как есть" это ни разу не описание формата данных. по стандарту к ним всяко должен идти заголовок
и заменять его своим - это как-то криво совсем. а не использовать то что вводит программист в CustomHeaders вообще - это дикий треш )))
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
13.06.2017, 15:17
Помогаю со студенческими работами здесь

вакансия программиста под мобильные приложения и не только
Студия по созданию мобильных приложений ищет талантливого и любящего свое дело, разработчика, способного создавать приложения для ios и...

Как с помощью Rad Studio XE5 писать приложения под Android?
Здравствуйте. Объясните как используя данный софт, писать на андроид? Последовательность действий моих, потому что у меня только ios...

Delphi XE5 разработка под Android. Как получить видео с AUX входа?
Здравствуйте. У меня проблема... купил в быдло-фирме камеру переднего вида и магнитолу на андроиде. Проблема в том, что у камеры два...

Посоветуйте хорошую лит-ру для того,чтобы научиться писать приложения под мобильные устройства
Всем привет,я более-менее умею пользоваться С++ для написания консольных приложений,но я хочу идти дальше - делать полноценные приложения(с...

Как "растянуть" шаблон под мобильные приложения?
Здравствуйте. WP 4.3 Шаблон &quot;Ocean Kid&quot;. Я не специалист по ВП, делаю знакомой простенький сайт. Подскажите, что сделать, что бы в...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Опции темы

Новые блоги и статьи
Новый ноутбук
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 . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru