-
Постов
414 -
Зарегистрирован
-
Посещение
-
Победитель дней
36
Активность репутации
-
Barbanel отреагировална Vitaldj в Версия андроид
Нееет, там полная ...опа. Я помучался пару дней и купил дешманский андроид))
-
Barbanel отреагировална Евгений Корепов в Передача и прием JSON в PHP
Я бы переделал и код отправки и код приема.
При отправке вы выполняете лишние действия, проверяете наличие интернет, преобразуете json в лист.
Отправка любым способом желательна в виде "Ключ=Значение", чтоб на стороне сервера корректно распознать данные.
Вот отправка POST (добавьте в uses System.Net.Mime):
function TForm1.PostURL(const aurl, json: string): string; var AHTTPClient : THTTPClient; AHttpResponse: IHttpResponse; ASource: TMultipartFormData; begin result:= ''; AHTTPClient:= THTTPClient.Create; ASource:=TMultipartFormData.Create(); ASource.AddField('request', json); try try AHttpResponse := AHTTPClient.Post(aurl, ASource); if AHttpResponse.StatusCode <> 200 then Result := AHttpResponse.StatusText else Result := AHttpResponse.ContentAsString(); except on E: exception do ShowMessage('Ошибка сети: '+E.Message); end; finally FreeAndNil(ASource); FreeAndNil(AHTTPClient); end; end; Но гораздо проще и быстрее делать GET (добавьте в uses System.NetEncoding):
function TForm1.GetURL(const aurl, json: string): string; var AHTTPClient : THTTPClient; AHttpResponse: IHttpResponse; AEncodedJSON : String; begin result:= ''; AHTTPClient:= THTTPClient.Create; AEncodedJSON:=System.NetEncoding.TURLEncoding.URL.Encode(json); try try AHttpResponse := AHTTPClient.Get(aurl + '?request=' + AEncodedJSON); if AHttpResponse.StatusCode <> 200 then Result := AHttpResponse.StatusText else Result := AHttpResponse.ContentAsString(); except on E: exception do ShowMessage('Ошибка сети: '+E.Message); end; finally FreeAndNil(AHTTPClient); end; end; file_get_contents("php://input", "r") - это тоже вариант, но никогда такое не используйте.
На стороне сервера, в php есть специальные глобальные переменные для получения данных $_REQUEST, $_POST и $_GET.
$_POST и $_GET - для соответствующих HTTP методов. $_REQUEST - универсальный.
Вот вам код php для сервера, я там описал вспомогательную функцию лога MyLog, измените путь логов на свой.
<?php @ini_set("display_errors", "1"); error_reporting(E_ALL); //@ini_set("display_errors", "0"); error_reporting(0); function MyLog($Title, $Value = "", $Debug = false) { $LogFile = "/var/log/service/test001.log"; if (is_array($Title)) $Title = "\n".print_r($Title, true)."\n"; if (is_array($Value)) $Value = "\n".print_r($Value, true)."\n"; $Message = date("Y.m.d H:i:s")." ".$Title.$Value."\r\n"; if ($Debug) echo $Message; file_put_contents($LogFile, $Message, FILE_APPEND); } // Проверяем наличие параметра request if (!isset($_REQUEST["request"])) { echo "Нет параметров"; return; } // Декодируем строку из $_REQUEST["request"] в массив $RequesrArray = json_decode($_REQUEST["request"], true); // Проверяем прошло ли декодирование нормально if (!isset($RequesrArray)) { echo "Ошибочный JSON"; return; } MyLog('*************************************************************************************************************************'); MyLog('$_REQUEST:', $_REQUEST); MyLog('$_POST:', $_POST); MyLog('$_GET:', $_GET); MyLog('$RequesrArray:', $RequesrArray); // Работаем с массивом $RequesrArray $lessongrid_type = $RequesrArray['lessongrid_type']; $schedule0 = $RequesrArray['schedule'][0]; Обратите внимание json_decode($_REQUEST["request"], true); используется с вторым параметром true - при этом создается не объект (медленно), а ассоциативный массив (быстрее некуда).
Вот код Delphi
procedure TForm1.FormCreate(Sender: TObject); Var AURL : String; AJSON : String; begin AURL:='http://myserver.ru/api/test001.php'; AJSON:='{"lessongrid_idpartner":2,"lessongrid_type":0,"lessongrid_idpointcity":1,"lessongrid_iddircourses":1,"lessongrid_idteacher":1,"schedule":["0:00","5:00","0:00","0:00","0:00","0:00","0:00"]}'; PostURL(AURL, AJSON); GetURL(AURL, AJSON); end; А вот логи на стороне сервера:
2019.06.06 13:29:13 ************************************************************************************************************************* 2019.06.06 13:29:13 $_REQUEST: Array ( [request] => {"lessongrid_idpartner":2,"lessongrid_type":0,"lessongrid_idpointcity":1,"lessongrid_iddircourses":1,"lessongrid_idteacher":1,"schedule":["0:00","5:00","0:00","0:00","0:00","0:00","0:00"]} ) 2019.06.06 13:29:13 $_POST: Array ( [request] => {"lessongrid_idpartner":2,"lessongrid_type":0,"lessongrid_idpointcity":1,"lessongrid_iddircourses":1,"lessongrid_idteacher":1,"schedule":["0:00","5:00","0:00","0:00","0:00","0:00","0:00"]} ) 2019.06.06 13:29:13 $_GET: Array ( ) 2019.06.06 13:29:13 $RequesrArray: Array ( [lessongrid_idpartner] => 2 [lessongrid_type] => 0 [lessongrid_idpointcity] => 1 [lessongrid_iddircourses] => 1 [lessongrid_idteacher] => 1 [schedule] => Array ( [0] => 0:00 [1] => 5:00 [2] => 0:00 [3] => 0:00 [4] => 0:00 [5] => 0:00 [6] => 0:00 ) ) 2019.06.06 13:29:13 ************************************************************************************************************************* 2019.06.06 13:29:13 $_REQUEST: Array ( [request] => {"lessongrid_idpartner":2,"lessongrid_type":0,"lessongrid_idpointcity":1,"lessongrid_iddircourses":1,"lessongrid_idteacher":1,"schedule":["0:00","5:00","0:00","0:00","0:00","0:00","0:00"]} ) 2019.06.06 13:29:13 $_POST: Array ( ) 2019.06.06 13:29:13 $_GET: Array ( [request] => {"lessongrid_idpartner":2,"lessongrid_type":0,"lessongrid_idpointcity":1,"lessongrid_iddircourses":1,"lessongrid_idteacher":1,"schedule":["0:00","5:00","0:00","0:00","0:00","0:00","0:00"]} ) 2019.06.06 13:29:13 $RequesrArray: Array ( [lessongrid_idpartner] => 2 [lessongrid_type] => 0 [lessongrid_idpointcity] => 1 [lessongrid_iddircourses] => 1 [lessongrid_idteacher] => 1 [schedule] => Array ( [0] => 0:00 [1] => 5:00 [2] => 0:00 [3] => 0:00 [4] => 0:00 [5] => 0:00 [6] => 0:00 ) ) Как видите можно использовать код с $_REQUEST в обоих случаях.
Вот итоговый код php
<?php @ini_set("display_errors", "1"); error_reporting(E_ALL); //@ini_set("display_errors", "0"); error_reporting(0); // Проверяем наличие параметра request if (!isset($_REQUEST["request"])) { echo "Нет параметров"; return; } // Декодируем строку из $_REQUEST["request"] в массив $RequesrArray = json_decode($_REQUEST["request"], true); // Проверяем прошло ли декодирование нормально if (!isset($RequesrArray)) { echo "Ошибочный JSON"; return; } // Работаем с массивом $RequesrArray $lessongrid_type = $RequesrArray['lessongrid_type']; $schedule0 = $RequesrArray['schedule'][0];
-
Barbanel получил реакцию от Ingalime в Версия андроид
Никто ведь не собирается удаленно у нескольких миллионов пользователей выпиливать ОС со всеми личными данными.
Даже если и сольют, на существующих устройствах все еще можно разрабатывать и тестировать под Андроид 6, 7, 8, 9
Но новые функции очевидно не протестировать, да.
Хотя о чем мы, эмба и новые функции - понятия полярные)))
-
Barbanel отреагировална Евгений Корепов в Версия андроид
Покупайте любой телефон с андроидом посвежее (потому как в последней версии студии на андроиде < 5 вы ничего уже не запустите).
И обязательно берите чистый аднроид, никаких HTC, Samsung, Xiaomi с их мега-облочками.
Вот к примеру Xiaomi A1 - модель с чистым андроидом, вполне себе средний телефон, не дорого.
-
Barbanel отреагировална Sergionn в Не могу выложить программу в гугл магазин
пообещали в бете 10.4, т.е. если разработчик на комьюнити или на лечении, то тогда ждет до релиза в конце 2019((,
как бы с такими сроками все во флаттер не ушли, окончательно((
-
Barbanel получил реакцию от Ingalime в Не могу выложить программу в гугл магазин
Тут написано что вам нужно скомпилировать приложение также и для 64битных платформ.
Сделайте это, и будет вам счастье ?
-
Barbanel отреагировална Евгений Корепов в Непонятная ситуация в Webbrowser
Продукты Apple не умеют корректно декодировать URL. Это исключительно ваша задача. Все другие платформы делают это автоматически.
Вам нужно добавить код:
uses System.NetEncoding; ... URL:='http://blabla.com/php/pay2.php?eks=' + System.NetEncoding.TURLEncoding.URL.Encode('блабла&sum=100&hash=блабла&orderid=205');
-
Barbanel отреагировална Ra72 в Мобильная разработка на Delphi 10.3 (Professional)
Да, ответили следующее: Сделать Update лицензии, если "...with Mobile" не появилось, тогда удалить лицензию и повторно зарегистрировать.
Update мне не помог, а вот удаление лицензии в License Manager-е и регистрация заново - помогло.
-
Barbanel отреагировална Dmitry Stolyarov в Разбор JSON с мультизапросом
krapotkin, спасибо!
Публикую, может кому-то пригодится..
на стороне PHP:
$query1 = "SELECT ... FROM `...`;"; $query2 = "SELECT ... FROM `...`;"; $query3 = "SELECT ... FROM `...`;"; $query4 = "SELECT ... FROM `...`;"; function GetValuesAsJson($query, $Link) { if ($DBResult = mysqli_query($Link, $query)) { $ResultArray = array(); $Index = 0; while ($row = mysqli_fetch_array($DBResult, MYSQLI_ASSOC)) { $ResultArray[$Index] = $row; $Index++; } $ResultJSON = json_encode($ResultArray, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE); return $ResultJSON; mysqli_free_result($DBResult); } }; echo '{"Arr1":'. GetValuesAsJson($query1, $DBLink).', "Arr2":'.GetValuesAsJson($query2, $DBLink).', "Arr3":'.GetValuesAsJson($query3, $DBLink).', "Arr4":'.GetValuesAsJson($query4, $DBLink).'}'; mysqli_close($DBLink); на стороне delphi:
xJS := SO(aJSON); with xJS.A['Arr1'] do // имя массива begin for j := 0 to length - 1 do begin xObj := O[j]; Memo1.Lines.Add(xObj.S['cities_name']); // собираем нужные данные ... end;
-
Barbanel отреагировална krapotkin в Разбор JSON с мультизапросом
вы просто без разделителей склеиваете три разных JSON-массива
вам бы каждый из них описать отдельно. да и вообще принято логически законченные участки кода выделять в отдельные функции
function GetValuesAsJson($query) { ..... } тогда будет например
'{"Arr1":'. GetValuesAsJson($query1). ', "Arr2":'.GetValuesAsJson($query2).', "Arr3":'.GetValuesAsJson($query3).'}' ну и разбор полученного объекта например с помощью XSuperObject. Примеры есть на офсайте https://github.com/onryldz/x-superobject
-
Barbanel получил реакцию от Ingalime в переход к x64?
Для андроида? Нет.
Здесь https://codematters.online/embarcadero-august-2018-product-roadmap-part-1/ утверждается что компилятор будет готов к лету:
-
Barbanel получил реакцию от Ingalime в Мобильная разработка на Delphi 10.3 (Professional)
Правый клик по узлу Target Platforms -> Add Platform.
-
Barbanel получил реакцию от Ingalime в "Column index 1 out of bound" но не все так просто как может показаться...Нужна помощь или совет...
Не сталкивался.
Решение в лоб: забекапь .dproj и .deployproj и удали их, это обнулит настройки проекта.
После этого зайди в настройки проекта и настрой все заново.
-
Barbanel получил реакцию от Tumaso в "Column index 1 out of bound" но не все так просто как может показаться...Нужна помощь или совет...
Не сталкивался.
Решение в лоб: забекапь .dproj и .deployproj и удали их, это обнулит настройки проекта.
После этого зайди в настройки проекта и настрой все заново.
-
Barbanel получил реакцию от Tumaso в "Column index 1 out of bound" но не все так просто как может показаться...Нужна помощь или совет...
Пишем в данный момент на 10.3.1, в т.ч. под iOS.
Перед этим писали на всех версиях начиная с Берлина.
Live bindings не используем, т.к. наслышаны про его странное поведение.
Да, больше писанины, но и уверенности что все работает именно так как нужно - тоже больше.
Да, вы можете отказаться от "сырой" студии, без проблем, никто не запрещает.
Но есть шанс что вы путаете теплое с мягким - студию в целом с одним глючным решением.
-
Barbanel получил реакцию от Ingalime в "Column index 1 out of bound" но не все так просто как может показаться...Нужна помощь или совет...
Пишем в данный момент на 10.3.1, в т.ч. под iOS.
Перед этим писали на всех версиях начиная с Берлина.
Live bindings не используем, т.к. наслышаны про его странное поведение.
Да, больше писанины, но и уверенности что все работает именно так как нужно - тоже больше.
Да, вы можете отказаться от "сырой" студии, без проблем, никто не запрещает.
Но есть шанс что вы путаете теплое с мягким - студию в целом с одним глючным решением.
-
Barbanel получил реакцию от Евгений Корепов в Идентификация устройства
Всем доброго времени!
Как и обещал, выкладываю либы для работы с KeyChain.
Либы были взяты у братьев-китайцев, ни слова про покупку сказано не было (хотя чтобы выкачать их пришлось заплатить какому-то облачному сервису).
Использовать просто, за все отвечают три функции:
function StoreItemToKeychain(const AServiceName, AKey, AValue: string; const bOverride: Boolean=True): Boolean; function GetItemValueFromKeychain(const AServiceName, AKey: string): string; function DeleteItemFromKeychain(const AServiceName, AKey: string): Boolean; Ну и традиционно нужно подключить саму библиотеку, все находится в аттаче.
Enjoy! ?
iOS_KeyChain.zip
-
Barbanel отреагировална Alexander Samosyuk в TRectangle3D
Решилось установкой XE 10.3 Rio. По другому в XE10.2.3 не работает
-
Barbanel отреагировална Равиль Зарипов (ZuBy) в GIT - как с ним наиболее просто работать
если нужно чтобы проекты были в гите и секьюрно, то можно воспользоваться решением от atlassian.
купить продукт Server, развернуть на любом сервере. стартер пак - 10$ на 10 человек
-
Barbanel отреагировална Tumaso в GIT - как с ним наиболее просто работать
@Barbanel
вот неплохое описание, как в Git делать Pull Request в существующем проекте
-
Barbanel отреагировална mazayhin в Пути к ресурсам андройд
Вот статья, что куда деплоить надо, и как получить доступ к этому
http://delphifmandroid.blogspot.com/2014/02/deployment-manager.html
-
Barbanel отреагировална dnekrasov в Создание ссылки из TLabel.
Просто надо привыкнуть к новому подходу к некоторым вещам. Зато возможностей побольше, чем в VCL. Да и удобнее, когда привыкнешь. ИМХО
-
Barbanel получил реакцию от #WAMACO в Андроид. Обучение пользователя новым функциям приложения
В аттаче пример того как я себе представляю такую реализацию. Будем использовать в нашем проекте.
Буду рад критике, предложениям, и все такое.
TestWhatsNew.zip
-
Barbanel отреагировална OnePeople в Андроид. Обучение пользователя новым функциям приложения
Тоже свой вариант по быстрому накидал, как пример
WhatNew.rar
-
Barbanel получил реакцию от OnePeople в Андроид. Обучение пользователя новым функциям приложения
В аттаче пример того как я себе представляю такую реализацию. Будем использовать в нашем проекте.
Буду рад критике, предложениям, и все такое.
TestWhatsNew.zip