Либо я чего-то не понимаю, либо одно из двух...
Люди добрые, шибко хелп нужен!
Проблема в следующем - никак не могу разобраться с методом POST компонента TNMHTTP. Подскажите - в каком виде ему нужно запихивать параметр PostData?
Поясню: к примеру url - site.ru/getmsg.php3
хаваются три параметра:
author,subject,body.
InputFileMode и OutputFileMode = false;
Если я делаю вызов метода POST с параметрами:
_internet->Post
("www.site.ru/getmsg.php3? author=1&subject=2&body=3",
""); - то все срабатывает просто изумительно.
а при попытке: _internet->Post("www.site.ru/getmsg.php3","author=1&subject=2&body=3"); - скрипт срабатывает, но параметры не передаются.
Подозреваю, что я что-то делаю не так в строке PostData. Может еще что-нужно добавить?
Заранее благодарен.
Если я делаю вызов метода POST с параметрами:
_internet->Post
("www.site.ru/getmsg.php3? author=1&subject=2&body=3",
""); - то все срабатывает просто изумительно.
а при попытке: _internet->Post("www.site.ru/getmsg.php3","author=1&subject=2&body=3"); - скрипт срабатывает, но параметры не передаются.
Подозреваю, что я что-то делаю не так в строке PostData. Может еще что-нужно добавить?
Заранее благодарен.
А вот так не пробовал ("www.site.ru/getmsg.php3","?author=1&subject=2&body=3");?
Пробовал. Не работает!
Выпил пива стало легче...:)
Что по этому поводу думает борлад:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
NMHTTP1->Get(Edit1->Text);
}
When Button1 is clicked, the Get method is used to retrieved the document at the address specified by Edit1. Both the document body and the document header are retrieved.
void __fastcall TForm1::Button6Click(TObject *Sender)
{
AnsiString S;
if (InputQuery("Post Data Required", "Input data to Post", S))
NMHTTP1->Post(Edit1->Text, S);
}
When Button6 is clicked, the InputQuery function is used to retrieve the data to be posted. If the Ok button is clicked, the data that was input is posted using the Post method to the document specified by the address in Edit1.
Вобще-то если я не ошибаюсь, то метод который используешь ты - это именно GET.Потому у тебя он и работает без второго параметра. Метод POST должен получить другие данные на входе...:) И скрипт должен знать как с ними работать.
"author.1&sabject.2&body.3"
если уж так тебе хочется делать это через POST.
ессественно скрипт на сервере должен смочь что то типа:
@formfields=split /&/,$query;
foreach(@formfields){
if(/^author=(.*)/){$author= urldecode($1);}
if(/^sabject=(.*)/){$sabject = urldecode($1);}
if(/^body=(.*)/){$body=urldecode($1);}
То есть строка твоя должна выглядеть примерно таким образом:
"author.1&sabject.2&body.3"
если уж так тебе хочется делать это через POST.
ессественно скрипт на сервере должен смочь что то типа:
@formfields=split /&/,$query;
foreach(@formfields){
if(/^author=(.*)/){$author= urldecode($1);}
if(/^sabject=(.*)/){$sabject = urldecode($1);}
if(/^body=(.*)/){$body=urldecode($1);}
Попробую зайти с другой стороны:
Кусок HTML:
<form method=POST action=www.site.ru/getmsg.php3>
<input type=text name=author>
<input type=text name=subject>
<textarea name=body>
<input type=submit name=bsubmit>
Кусок PHP:
$mess = "Автор: $author\n";
$mess.= "Тема: $subject\n";
$mess.= "Сообщение: $body\n";
mail("myemail@inbox.ru", $subject, $mess, "From: $author")
Все это работает - проверял у себя на сайте.
Более того -
если запускаю билдеровскую прогу и выполняю:
_internet->Post
("www.site.ru/getmsg.php3? author=1&subject=2&body=3",
"");
или
_internet->Get
("www.site.ru/getmsg.php3? author=1&subject=2&body=3",
"");
то мне в почтовый ящик приходит письмо:
From: 1 Subject: 2
Автор: 1
Тема: 2
Сообщение: 3
А вот если я выполняю:
_internet->Post
("www.site.ru/getmsg.php3",
"author=1&subject=2&body=3");
или
_internet->Post
("www.site.ru/getmsg.php3",
"?author=1&subject=2&body=3");
или
_internet->Post
("www.site.ru/getmsg.php3",
"author.1&sabject.2&body.3");
или
_internet->Post
("www.site.ru/getmsg.php3",
"?author.1&sabject.2&body.3");
приходит письмо с таким содержанием:
From: Subject:
Автор:
Тема:
Сообщение:
Вот такие вот пирожки с котятами. Мне скоро прогу сдавать - а на этом месте я подвис качественно. И пока не могу решить сию проблему.
Попробую зайти с другой стороны:
Кусок HTML:
<form method=POST action=www.site.ru/getmsg.php3>
<input type=text name=author>
<input type=text name=subject>
<textarea name=body>
<input type=submit name=bsubmit>
Кусок PHP:
$mess = "Автор: $author\n";
$mess.= "Тема: $subject\n";
$mess.= "Сообщение: $body\n";
mail("myemail@inbox.ru", $subject, $mess, "From: $author")
Все это работает - проверял у себя на сайте.
Я хотел бы обратить твое внимание что, тот кусок скрипта кот. на писан на Перле и служит для определения полей в форме
@formfields=split /&/,$query;
Здесь поля формы разделяются. Т.е. создатся массив
с именем фордфайлдс и в него запихиваются поля и значения из квери.
if(/^author=(.*)/){$author= urldecode($1);}
if(/^sabject=(.*)/){$sabject = urldecode($1);}
if(/^body=(.*)/){$body=urldecode($1);}
А здесь строки декодируются и обрабатываются. Функция urldecode определена в отдельном модуле и ее задаче я вляется принять переменную и привести к нужному виду.
$mess = "Автор: $author\n";
$mess.= "Тема: $subject\n";
$mess.= "Сообщение: $body\n";
А ты показываешь уже обработанные переменные...
Где декодируются $author и пр.?
Для пиэйчпи должно быть примерно вот так
if($REQUEST_MEDOD == "POST"){
// Здесь идет обработ ошибок и пр.
$author = $form["author"];
mess = "Автор " $author;
//и т.д.
}
Но это не готовая программа - это пример!!!!
Посмотри доки по предаче данных, что является разделителем.
Я хотел бы обратить твое внимание что, тот кусок скрипта кот. на писан на Перле и служит для определения полей в форме
Здесь поля формы разделяются. Т.е. создатся массив
с именем фордфайлдс и в него запихиваются поля и значения из квери.
А здесь строки декодируются и обрабатываются. Функция urldecode определена в отдельном модуле и ее задаче я вляется принять переменную и привести к нужному виду.
А ты показываешь уже обработанные переменные...
Где декодируются $author и пр.?
Для пиэйчпи должно быть примерно вот так
Но это не готовая программа - это пример!!!!
Посмотри доки по предаче данных, что является разделителем.
Брррр...
Я конечно не силен в PHP - честно говоря это был мой первый опыт работы с ним, но я написал PHP-шный код именно в том виде, в котором он лежит у меня на сайте. Без дополнительных декодингов. Если хочешь - могу прислать копию. Я воспользовался где-то скачанным примером, который переработал в своих нуждах! Так что писал сюда все так как есть.
Проблема наконец решена!
Все дело оказывается было в глюке самого TNMHTTP - руки бы оторвать тому программеру, который этот компонент писал.
Весь прикол в следующем - методом POST можно отправлять данные ТОЛЬКО из файлов! Строки он не хочет хавать принципиально - почему не известно.
Так что приходится поступать следующим образом:
пишем файл params.txt:
author=1&subject=2&body=3
далее:
_internet->OutputFileMode=true;
_internet->Post("www.site.ru/script.php3","params.txt"); - и все работает, блин. Столько времени из-за такой фигни потерял.
Кстати, у кого-нибудь, случайно нет примеров использования Indy компонентов? Всмысле каких-нить демонстрационных исходников - конкретно по компоненту TIdHTTP? А то в сорцах самого билдера эта ценная информация отсутствует напрочь!
Заранее спасибо!