Я отлаживаю программу для отправки данных по методу Post через TWebBrowser на локальном сервере Apache (из пакета Денвер). Я пытаюсь переслать данные по методу Post в PHP скрипт. Посылаю данные так:
function Str2Variant(S:string):OleVariant;
var Data:Pointer;
begin
Result:=VarArrayCreate([0,Length(S)],varByte);
Data:=VarArrayLock(Result);
try
Move(S[1],Data^,Length(S));
finally
VarArrayUnlock(Result);
end;
Result[Length(S)]:=0;
end;
По нажатию кнопки выполняется код:
var URL,Flags,TargetFrameName,PostData,Headers:OleVariant;
begin
PostData:=Str2Variant('Name=Python&Surname=SmiSoft&EMail=email@site.ru&Comment=Comment');
URL:='http://www.smisoft.test1.ru/HandleForm.php';
Flags:=EmptyParam;
TargetFrameName:=EmptyParam;
Headers:=EmptyParam;
WebBrowser1.Navigate(URL, Flags, TargetFrameName, PostData, Headers);
end;
PHP скрипт отвечает, что все переданные переменные не определены! Я проверил, что данные передаются правильно и в BeforeNavigate2 вставил такую строчку:
Memo1.Lines.Text:=PostData;
У меня высвечиваются только куча знаков вопроса. Я написал такую функцию:
function Variant2Str(V:OleVariant):string;
var Data:pointer;
begin
SetLength(Result,Length(V)*2);
Data:=VarArrayLock(V);
Move(Data^,Result[1],Length(V)*2);
VarArrayUnlock(V);
end;
И вывожу таким образом:
Memo1.Lines.Text:=Variant2Str(PostData);
Данные PostData выводятся правильно! Но переменные в PHP скрипте все равно не определены! Если заполнить форму, то данные передаются правильно! Где я грабли поймал? Форма:
Уважаемые авторы вопросов! Большая просьба сообщить о результатах решения проблемы на этой странице. Иначе, следящие за обсуждением, возможно имеющие аналогичные проблемы, не получают ясного представления об их решении. А авторы ответов не получают обратной связи. Что можно расценивать, как проявление неуважения к отвечающим от автора вопроса.
29-11-2006 10:31 | Сообщение от автора вопроса
To SATANA:
>>> добавь для POST
Проблема уже решена. Повторяю: я использую метод, предложенный в посте 13-01-2006 15:09. А предложенный тобой подход уже обсуждался в посте 29-11-2005 06:12 и не дает необходимого/ожидаемого результата.
>>> не выходит на методе POST компонента TWebBrowser. Надо все-таки использовать Indy
Да нет, можно работать и с WebBrowser, только если отправляешь данные на сервер с кодировкой не Windows, то надо производить перекодировку, а то русские буквы исчезают :(
Знаки + не отправлялись на сервер, это глюк, поэтому пишу поправленную функцию:
function UrlEncode(const S:string;NeedUTF8:boolean=false):string;
var I:integer;
W:UTF8String;
begin
Result:='';
if NeedUTF8 then W:=Utf8Encode(S) else W:=S;
For I:=1 to Length(W) do case W[I] of
'%',' ','&','=','@','.',#13,#10,'+',#128..#255:Result:=Result+'%'+inttohex(ord(W[I]),2);
else Result:=Result+W[I];
end;
end;
Проблема с отсылкой данных решена.
Для этого пришлось написать собственную версию функции UrlEncode:
function UrlEncode(const S:string;NeedUTF8:boolean=false):string;
var I:integer;
W:UTF8String;
begin
Result:='';
if NeedUTF8 then W:=Utf8Encode(S) else W:=S;
For I:=1 to Length(W) do case W[I] of
'%',' ','&','=','@','.',#13,#10,#128..#255:Result:=Result '%' inttohex(ord(W[I]),2);
else Result:=Result W[I];
end;
end;
Дело в том, что стандартная функция UrlEncode из Indy 8 (устанавливается вместе с Delphi 6.0) не поддерживает Utf-8 (в котором надо отправлять данные на Королевство), а чем пользоваться в Indy 10 для кодировки я не понял (функции UrlEncode в явном виде там нет). Если у кого есть поправки по поводу вида функции, прошу написать в этом вопросе. Также хотелось бы узнать нормальное "цивилизованное" решение этой проблемы (ни за что не поверю, что в Indy 10 нет уже реализованного метода кодирования передаваемых данных в Utf-8).
Очередная попытка отправки данных. Теперь установил Indy 10. Раньше была 8 версия. Еще написал новую версию функции UrlEncode. Теперь она поддерживает UTF8. Надеюсь, что теперь все заработает.
>>> Вопрос в том, почему такой глюк при передаче данных на сервер?
На этот вопрос может ответить только Елена Филиппова, а она вряд ли сюда заглянет. Попытайтесь связаться с ней напрямую или через "Книгу жалоб и предложений".
Опа! Два предыдущих ответа я отправил с помощью своей программы (чтобы не мусорить в чужих вопросах) и получились глюки. Код для отправки такой:
var Source:TStringStream;
Fin:TFileStream;
begin
....
with Query do begin
Http.Request.ExtraHeaders.Text:=Cookies;
Http.Request.Connection:='Keep-Alive';
Http.Request.ContentType:='application/x-www-form-urlencoded';
Source:=TStringStream.Create(Format('Send=on&IDAnswer=%d&LevelID=%d&body=%s',
[FieldByName('Question').AsInteger,FieldByName('Kind').AsInteger,UrlEncode(FieldByName('Answer').AsString)]));
Fin:=TFileStream.Create('temp.htm',fmCreate);
try
Http.Post('http://www.delphikingdom.com/asp/answer.asp?IDAnswer='+FieldByName('Question').AsString,Source,Fin);
Информация берется из БД, надеюсь, имена полей говорящие. Query - TADOQuery, в котором содержатся данные(там все правильно, проверено). В переменной Cookies хранятся ранее полученные кукиши с login.asp (данные о регистрации). Режим Keep-Alive задан для того, чтобы можно было постить сразу несколько вопросов, потом соединение закрывается. Если что непонятно - спрашивайте. Вопрос в том, почему такой глюк при передаче данных на сервер? Неправильно кодируютя данные функцией UrlEncode? Но при передаче на локальном Апаче данные передаются корректно!
To Monach:
Не работает. Может быть, проблема в Apache? Дело в том, что я попытался использовать для той же задачи другие компоненты, такие как NMHTTP (это демка, каталог $(Delphi)\Demos\NetMaster\HTTP, Indy - тот же эффект. Есть ли где в Интернете сайт, на котором можно безбоязненно потренироваться? Дело в том, что я написал программу - оффлайн клиент для работыы с вопросами Королевства. Оплата интернета у меня повременная, поэтому я загружаю вопросы себе на диск, отвечаю, отключившись от сети а затем загружаю их на сервер. Проблема в том, что приходится загружать вручную, а это очень неэффективно. Использование метода Get невозможно, из-за большого объема ответов. Еще требуется сохранить полученную после передачи страницу на диск, но с этим проблем нет. Просто я хочу показать, что должно получиться в итоге, чтобы Вы не гадали на кофейной гуще. Может, у кого то есть подобные разработки. Ведь пример, приведенный в вопросе взят из статьи "Использование функциональности IE или заметки о WebBrowser" с Королевства (не помню раздел)! Неужели там ошибка?
29-11-2005 06:12 | Комментарий к предыдущим ответам
Уважаймые такая же проблема. Данные на сервер уходят, но php скрипт их не выводит:
echo $_POST['param1'];
Просмотрел весь круглый стол, тема явно не раскрыта. Неужели никто не занимался эти вопросом ?
Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter. Функция может не работать в некоторых версиях броузеров.