У меня есть аналогичный вопрос здесь, но он был ориентирован на сторону PHP. Похоже, PHP может получить пакет данных и сразу (в том же сеансе) отправить и ответить. Мой вопрос: может ли Delphi это сделать? Из того, что я знаю, ответ - большой НЕТ. Мне нужно сделать это в два этапа (две процедуры). Дело в том, что сессия, вероятно, будет закрыта, когда закончится первая процедура. Могу ли я держать сеанс открытым между двумя вызовами процедур.
Я дам вам пример кода для PHP
и Delphi
. Мы будем использовать метод запроса GET
, потому что это намного проще и достаточно, если вам не нужно отправлять слишком много данных. Я начну с PHP
script, потому что он может быть протестирован один, без приложения Delphi
(мы проверим его с помощью браузера).
<?php
$a=$_GET['a'];
$b=$_GET['b'];
echo intval($a)*intval($b);
?>
Эти сценарии ожидают, что два значения будут отправлены в URL (a и b), умножится на значения и вернет ответ. Предполагая, что вы играете на компьютере, на котором работает LAMP, и вы назвали этот script script.php
, если вы переходите к этому в своем браузере:
http://localhost/script.php?a=2&b=3
Вы увидите это в своем браузере:
6
Чтобы разбить URL-адрес, который мы пишем в браузере: мы запрашиваем страницу /script.php
с сервера localhost
, и мы передаем эту строку запроса в script: a=2&b=3
. Материал, который идет после ?
в URL-адрес, представляет собой строку запроса; Символ &
разделяет две отдельные пары параметров = значение: a=2
и b=3
. На стороне PHP вы используете $a=$_GET['a']
, чтобы получить значение параметра a
. Это просто!
Теперь, когда мы знаем, что PHP script запущен и работает, мы можем перейти к части Delphi. Здесь процедура, которая умножает два значения, используя наиболее неэффективный метод, который можно вообразить:
function MultiplyTwoNumbers(a,b:Integer):Integer;
var url: string;
H: TIdHttp;
SS: TStringStream;
begin
// Prepare the URL
url := 'http://fisiere.sediu.ro/script.php?a=' + IntToStr(a) + '&b=' + IntToStr(b);
H := TIdHttp.Create(nil);
try
SS := TStringStream.Create;
try
H.Get(url, SS);
Result := StrToInt(SS.DataString);
finally SS.Free;
end;
finally H.Free;
end;
end;
Я намеренно оставил там свой правильный рабочий URL, поэтому вы можете фактически протестировать мою известную работу script.
Здесь вы можете назвать эту процедуру:
procedure TForm8.Button1Click(Sender: TObject);
begin
ShowMessage(IntToStr(MultiplyTwoNumbers(3,4)));
end;
Delphi app makes two calls, first to SendID then a second to GetDataBack
не работает, потому что вещь, работающая на сервере, когда вы вызываете (фактически GET) GetDataBack
, понятия не имеет, что кто-то когда-нибудь вызывал (GET
снова) SendID
.GET
-удаление данных с HTTP-сервера мы можем использовать строку запроса, чтобы легко отправить некоторую информацию. Если нам нужно отправить много информации, мы будем использовать запросы POST
.