Dmitry Stolyarov Опубликовано 24 мая, 2019 Поделиться Опубликовано 24 мая, 2019 (изменено) Подскажите, пжл, правильно ли принимаю на сервере JSON или нет. код вроде рабочий, но сомнения есть (т.к. опыта с PHP нет) формирую json и передаю его на сервер: procedure TfmNewGroup.Button1Click(Sender: TObject); var JSON: ISuperObject; Arr: ISuperArray; str: string; begin JSON:=TSuperObject.Create(); JSON.I['lessongrid_idpartner'] := 2; JSON.I['lessongrid_type'] := cbDirect.ListItems[cbDirect.ItemIndex].Tag; JSON.I['lessongrid_idpointcity'] := cbPoint.ListItems[cbPoint.ItemIndex].Tag;; JSON.I['lessongrid_iddircourses'] := cbDirCourse.ListItems[cbDirCourse.ItemIndex].Tag; JSON.I['lessongrid_idteacher'] := cbTeacher.ListItems[cbTeacher.ItemIndex].Tag; Arr:=TSuperArray.Create(); Arr.Add(FormatDateTime('t',tedSun.Time)); Arr.Add(FormatDateTime('t',tedM.Time)); Arr.Add(FormatDateTime('t',tedT.Time)); Arr.Add(FormatDateTime('t',tedW.Time)); Arr.Add(FormatDateTime('t',tedTh.Time)); Arr.Add(FormatDateTime('t',tedF.Time)); Arr.Add(FormatDateTime('t',tedS.Time)); JSON.A['schedule']:=arr; str:=JSON.AsJSON(); PostURL('http://is.sitename.ru/Ins.php',str); end; function PostURL(const aurl, json: string): string; var HTTPClient : THTTPClient; HttpResponse: IHttpResponse; JsonToSend: TStringStream; begin result:= ''; HTTPClient:= THTTPClient.Create; JsonToSend := TStringStream.Create(Json); with HTTPClient do try try if (Head('https://google.com').StatusCode < 400) then HttpResponse := Post(aurl,JsonToSend); Result := HttpResponse.ContentAsString(); except on E: exception do ShowMessage('Ошибка сети: '+E.Message); end; finally FreeAndNil(HTTPClient); FreeAndNil(JsonToSend); end; end; сформированный json: {"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"]} на сервере принимаю: <?php $s = file_get_contents("php://input", "r"); $obj=json_decode($s); echo $obj->schedule[2]; //так обращаюсь к массиву echo $obj->lessongrid_type; // так обращаюсь к конкретному параметру в JSon ?> Изменено 24 мая, 2019 пользователем Dmitry Stolyarov Цитата Ссылка на комментарий
0 krapotkin Опубликовано 25 мая, 2019 Поделиться Опубликовано 25 мая, 2019 а что? не работает? Цитата Ссылка на комментарий
0 Dmitry Stolyarov Опубликовано 25 мая, 2019 Автор Поделиться Опубликовано 25 мая, 2019 вроде работает, но за код php не уверен, что так правильно.. Цитата Ссылка на комментарий
0 #WAMACO Опубликовано 26 мая, 2019 Поделиться Опубликовано 26 мая, 2019 18 часов назад, Dmitry Stolyarov сказал: вроде работает, но за код php не уверен, что так правильно.. тут на форуме есть Равиль Зарипов, он толковый пэхапэшник, можно у него по поводу code review php кода спросить.... Цитата Ссылка на комментарий
2 Евгений Корепов Опубликовано 6 июня, 2019 Поделиться Опубликовано 6 июня, 2019 Я бы переделал и код отправки и код приема. При отправке вы выполняете лишние действия, проверяете наличие интернет, преобразуете 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]; mazayhin, Dimqa и Barbanel 3 Цитата Ссылка на комментарий
0 Dmitry Stolyarov Опубликовано 6 июня, 2019 Автор Поделиться Опубликовано 6 июня, 2019 Евгений, спасибо! Цитата Ссылка на комментарий
Вопрос
Dmitry Stolyarov
Подскажите, пжл, правильно ли принимаю на сервере JSON или нет.
код вроде рабочий, но сомнения есть (т.к. опыта с PHP нет)
формирую json и передаю его на сервер:
procedure TfmNewGroup.Button1Click(Sender: TObject); var JSON: ISuperObject; Arr: ISuperArray; str: string; begin JSON:=TSuperObject.Create(); JSON.I['lessongrid_idpartner'] := 2; JSON.I['lessongrid_type'] := cbDirect.ListItems[cbDirect.ItemIndex].Tag; JSON.I['lessongrid_idpointcity'] := cbPoint.ListItems[cbPoint.ItemIndex].Tag;; JSON.I['lessongrid_iddircourses'] := cbDirCourse.ListItems[cbDirCourse.ItemIndex].Tag; JSON.I['lessongrid_idteacher'] := cbTeacher.ListItems[cbTeacher.ItemIndex].Tag; Arr:=TSuperArray.Create(); Arr.Add(FormatDateTime('t',tedSun.Time)); Arr.Add(FormatDateTime('t',tedM.Time)); Arr.Add(FormatDateTime('t',tedT.Time)); Arr.Add(FormatDateTime('t',tedW.Time)); Arr.Add(FormatDateTime('t',tedTh.Time)); Arr.Add(FormatDateTime('t',tedF.Time)); Arr.Add(FormatDateTime('t',tedS.Time)); JSON.A['schedule']:=arr; str:=JSON.AsJSON(); PostURL('http://is.sitename.ru/Ins.php',str); end; function PostURL(const aurl, json: string): string; var HTTPClient : THTTPClient; HttpResponse: IHttpResponse; JsonToSend: TStringStream; begin result:= ''; HTTPClient:= THTTPClient.Create; JsonToSend := TStringStream.Create(Json); with HTTPClient do try try if (Head('https://google.com').StatusCode < 400) then HttpResponse := Post(aurl,JsonToSend); Result := HttpResponse.ContentAsString(); except on E: exception do ShowMessage('Ошибка сети: '+E.Message); end; finally FreeAndNil(HTTPClient); FreeAndNil(JsonToSend); end; end;
сформированный json:
{"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"]}
на сервере принимаю:
Ссылка на комментарий
5 ответов на этот вопрос
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.