Перейти к содержанию
Fire Monkey от А до Я
  • 0

Передача и прием JSON в PHP


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"]}

 

на сервере принимаю:

<?php
$s  = file_get_contents("php://input", "r");
$obj=json_decode($s);
echo $obj->schedule[2]; //так обращаюсь к массиву
echo $obj->lessongrid_type; // так обращаюсь к конкретному параметру в JSon
?>

 

Изменено пользователем Dmitry Stolyarov
Ссылка на комментарий

Рекомендуемые сообщения

  • 0
18 часов назад, Dmitry Stolyarov сказал:

вроде работает, но за код php не уверен, что так правильно.. 

тут на форуме есть Равиль Зарипов, он толковый пэхапэшник, можно у него по поводу code review php кода спросить....

Ссылка на комментарий
  • 2

Я бы переделал и код отправки и код приема.

При отправке вы выполняете лишние действия, проверяете наличие интернет, преобразуете 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];

 

Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...