Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Как реализовать передачу данных методом POST c помощью NMHTTP?

11K
06 июля 2008 года
amorphius
22 / / 13.03.2006
Есть форма:
 
Код:
<html>
<form action=1.php method=post>
<input type=text name=login>
<input type=password name=pass>
</form>
</html>


Как мне выполнить вход с помощью компонента NMHTTP?
Вычитал в хелпе функцию Post(AnsiString URL, AnsiString S); которая якобы передает строку S на страницу URL методом POST. Тем не менее не получилось у меня это.
Для теста написал php-страничку:
 
Код:
<PRE> <? print_r($_GET); ?>
         <? print_r($_POST); ?>  </PRE>


При посылке запроса GET, все передаваемые параметры выводится, но если сделать запрос POST, то ничего не выводит во втором массиве
11K
08 июля 2008 года
amorphius
22 / / 13.03.2006
все ясно с этим форумом, пошел я на сырцы.ру, мож там люди знающие есть
92
08 июля 2008 года
Тень Пса
2.2K / / 19.10.2006
а ты ожидал, что кинуться тебе сразу все помогать? =) все люди, у всех дела есть ;)

а как ты параметры передавал? ) ну, что в S помещал?

нужно, я так понимаю, примерно следующее

 
Код:
login=USER&password=SECRET
то есть как в raw-http запросах.
11K
08 июля 2008 года
amorphius
22 / / 13.03.2006
Цитата: Тень Пса
а ты ожидал, что кинуться тебе сразу все помогать?


2 дня как никак прошло.

Цитата:
а как ты параметры передавал? ) ну, что в S помещал?


какая уже разница что помещал, главное что оно не работает, расскажи мне как правильно надо

443
11 июля 2008 года
REmindER
292 / / 23.03.2003
Цитата: amorphius
все ясно с этим форумом, пошел я на сырцы.ру, мож там люди знающие есть


Прежде всего, тебе тут никто ничем не обязан, так что наберись терпения. Далее, если посмотреть структуру пакета запроса, то можно заметить, что вид данных post имеет вид rawurlencode. Почему - не знаю. По-видимому, из-за этого парсинг в $_POST невозможен. Как все-таки добыть эти данные:

1. если PHP установлен как модуль, то данные можно получить из $HTTP_RAW_POST_DATA или $GLOBALS['HTTP_RAW_POST_DATA']. В php.ini раскомментировать строчку: always_populate_raw_post_data = On или добавить в .htaccess: php_flag always_populate_raw_post_data On;
2. использовать stdin или input:

 
Код:
$socket = fopen("php://input", "rb");
$postdata = fread($socket, 10000);
fclose($socket);


Далее преобразовать в ассоциативный массив одним из способов. Можно parse_str:
 
Код:
parse_str(rawurldecode($postdata), $_MYPOST);
11K
11 июля 2008 года
amorphius
22 / / 13.03.2006
я не пойму к чему в такие дебри лезть, а для чего тогда придумали массивы $_POST и $_GET?
443
11 июля 2008 года
REmindER
292 / / 23.03.2003
Цитата: amorphius
я не пойму к чему в такие дебри лезть, а для чего тогда придумали массивы $_POST и $_GET?



Объясняю еще раз:

Цитата:
...если посмотреть структуру пакета запроса, то можно заметить, что вид данных post имеет вид rawurlencode. Почему - не знаю. По-видимому, из-за этого парсинг в $_POST невозможен.

Это ответ на твой вопрос. В исходнике TNMHTTP:

Код:
procedure TNMHTTP.Post(URL, PostData: string);
begin
  URL_Holder := URL; {Set Locator to URL for later}
    if FEncodePosts then
      begin
        NMURL1 := TNMURL.create(self);
        try
          if OutPutFileMode then
            begin
            end
          else
            begin
              NMURL1.InputString := postData;
              Postdata := NMURL1.Encode;
            end;
        finally
          NMURL1.Free;
        end;
      end;
  TheSendFile := PostData; {Set the file to send to filename}
  ConnType := CmdPOST; {Set Connection type to Post}
  HTTPConnect; {Connect to web and post}
end;


FEncodePosts - приватный, и конструкторе TNMHTTP ему присваивается true.

Если предложенные способы не нравятся, то используй Indy.
443
11 июля 2008 года
REmindER
292 / / 23.03.2003
Хотя вот можно пойти на хитрость и, ничего местами не меняя, в nmhttp.hpp вместо bool FEncodePosts; прописать
 
Код:
...
public:
    bool FEncodePosts;
private:
...

При инициализации приложения присваивать FEncodePosts значение false, и тогда $_POST будет содержать данные в нужном виде.
443
11 июля 2008 года
REmindER
292 / / 23.03.2003
Интересно, что в исходниках FastNet 98-го года в методе Post присутствует проверка FEncodePosts, а в исходниках за 2000-ый год этот участок кода закомментирован.
11K
11 июля 2008 года
amorphius
22 / / 13.03.2006
подскажите плиз где можно эти исходники достать
443
11 июля 2008 года
REmindER
292 / / 23.03.2003
Нашел - http://naf1971.narod.ru/FastNet.v5.6.3.D5-7.FS.rar

Проверил, работают. Собрал package в 6-ом Builder'е. $_POST работает как надо.
11K
12 июля 2008 года
amorphius
22 / / 13.03.2006
спс за ссылочку
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог