Форум программистов, компьютерный форум, киберфорум
Delphi: FireMonkey
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.61/18: Рейтинг темы: голосов - 18, средняя оценка - 4.61
0 / 0 / 0
Регистрация: 24.10.2016
Сообщений: 10
1

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

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

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

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

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

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

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

16
5784 / 4526 / 1431
Регистрация: 14.04.2014
Сообщений: 20,157
Записей в блоге: 20
04.06.2017, 08:09 2
если вы планируете писать под мобилы, то вам нужна версия не ниже Seattle и не выше (на тек. момент) Berlin Upd 2
так что уже тут вас ждет разочарование
а в указанных версиях есть родной нативный THttpClient, на который и нужно все переписать
это несложно
1
0 / 0 / 0
Регистрация: 24.10.2016
Сообщений: 10
04.06.2017, 22:22  [ТС] 3
Спасибо за ответ. Все говорят, что это очень глючный и тяжёлый компонент, особенно при использовании его в потоке, по этому мне не хотелось его использовать. Ну раз сказали, придётся переписывать. Когда закончу, возможно отпишусь.
0
5784 / 4526 / 1431
Регистрация: 14.04.2014
Сообщений: 20,157
Записей в блоге: 20
05.06.2017, 06:59 4
прямо интересно стало, о каком компоненте идет речь?
1
0 / 0 / 0
Регистрация: 24.10.2016
Сообщений: 10
05.06.2017, 23:52  [ТС] 5
И в правду, я с чего взял, что речь идёт о TIdHTTP. Даже уже переписал весь проект под него и у меня возникла проблема с ssl на android. Сейчас чуть-чуть одумался, установил Delphi XE8 и стал переписывать используя THttpClient. И меня появилась новая проблема, я не знаю, как добавить свои заголовки, например "X-Requested-With: XMLHttpRequest". Не подскажите?
0
5784 / 4526 / 1431
Регистрация: 14.04.2014
Сообщений: 20,157
Записей в блоге: 20
06.06.2017, 00:05 6
вот ровно так же как везде 1:1
ищем свойство которое содержит слово Headers и туда пихаем
и еще раз повторю
до 10.0 и после 10.1 никакой мобильной разработки нет...
1
0 / 0 / 0
Регистрация: 24.10.2016
Сообщений: 10
06.06.2017, 11:16  [ТС] 7
Спасибо, установил Delphi 10, почти всё работает. Почему-то не удаётся изменить Content Type при запросе. Изменяю так:
"HTTPClient.ContentType := 'application/json';", а он как был "application/x-www-form-urlencoded; charset=UTF-8", так и остаётся.
Проверяю этой программой - "http analyzer". Может я не правильно задаю ContentType или здесь есть свои хитрости?
0
5784 / 4526 / 1431
Регистрация: 14.04.2014
Сообщений: 20,157
Записей в блоге: 20
06.06.2017, 12:38 8
всегда есть хитрости.
нужно трассировать в отладчике сам вызов Get или Post, и смотреть, где переустанавливается значение ContentType
исходники же в наличии
Может, нужно httpClient.Request.ContentType ?
наизусть не скажу
1
0 / 0 / 0
Регистрация: 24.10.2016
Сообщений: 10
06.06.2017, 17:28  [ТС] 9
Ну, не знаю. Не удаётся мне 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
5784 / 4526 / 1431
Регистрация: 14.04.2014
Сообщений: 20,157
Записей в блоге: 20
06.06.2017, 21:31 10
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  [ТС] 11
Спасибо за пример кода, но Content Type не изменяется. Может во мне проблема?
Миниатюры
Synapse Delphi XE5 под мобильные приложения  
0
5784 / 4526 / 1431
Регистрация: 14.04.2014
Сообщений: 20,157
Записей в блоге: 20
08.06.2017, 21:35 12
определенно))
чуть изменим коды
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  [ТС] 13
Я в 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
5784 / 4526 / 1431
Регистрация: 14.04.2014
Сообщений: 20,157
Записей в блоге: 20
09.06.2017, 12:28 14
вообще, сервер должен анализировать заголовок и отправлять данные в запрошенном формате
если умеет/хочет
если сервер точно уверен, что должен вернуть json, можно ничего не разбирать и просто приделать нужный заголовок, как я и сделал сейчас

по поводу что за заголовки отправляет делфи, нужно действительно покопаться в коде. нет пока возможности
1
5784 / 4526 / 1431
Регистрация: 14.04.2014
Сообщений: 20,157
Записей в блоге: 20
10.06.2017, 21:06 15
Лучший ответ Сообщение было отмечено 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  [ТС] 16
Спасибо, за приведенный код, но всё оказалось на много проще.
Обратился я к форуму 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
5784 / 4526 / 1431
Регистрация: 14.04.2014
Сообщений: 20,157
Записей в блоге: 20
13.06.2017, 15:17 17
ну я это и написал собственно
нужно использовать Post(url, stream, stream, headers)
но это совсем не очевидно
данные "как есть" это ни разу не описание формата данных. по стандарту к ним всяко должен идти заголовок
и заменять его своим - это как-то криво совсем. а не использовать то что вводит программист в CustomHeaders вообще - это дикий треш )))
0
13.06.2017, 15:17
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.06.2017, 15:17
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru