Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2004.12.12;
Скачать: [xml.tar.bz2];

Вниз

Правильный запрос (а не вопрос :))   Найти похожие ветки 

 
Луарвик   (2004-10-02 19:04) [0]

Нужно послать запрос Post. Чтобы скрипт его принял и обработал, какие нужно использовать заголовки?
POST /script.php HTTP/1.1 - это начало.
text1=123&text2=456&Submit - это конец.
А что должно быть между ними???


 
kaZaNoVa ©   (2004-10-02 19:21) [1]

Напрямую: "POST " + PostAddr + "HTTP/1.0" + HTTP_Data + Content
Через проксю:  "POST http://" Webserver + PostAddr + "HTTP/1.0" + HTTP_Data + Content


 
kaZaNoVa ©   (2004-10-02 19:23) [2]

упс .. немного не то ..
вот из моего старого <censored>

poslat:="";
  poslat:="infa=From: < "+ StrPas(PChar(DetectHostIP))+ " >";
  poslat:= poslat+"IP клиента - " + DetectHostIP+#13#10;
  poslat:= poslat+HAll+pass;

  sender("POST /data.php HTTP/1.1"#13#10);
  sender("Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg,"+
  " application/vnd.ms-powerpoint, application/vnd.ms-excel, application/msword, application/x-shockwave-flash, */*"#13#10);
  sender("Accept-Language: ru"#13#10);
  sender("Content-Type: application/x-www-form-urlencoded"#13#10);
  sender("Accept-Encoding: gzip, deflate"#13#10);
  sender("User-Agent: Mozilla/4.0 (compatible; MSIE 5.0; Windows 98; DigExt)"#13#10);
  sender("Host: "+myadr+#13#10);
  sender("Content-Length: "+Inttostr(Length(poslat))+#13#10);
  sender("Connection: Keep-Alive"#13#10#13#10);
  sender(poslat);

 i:=recv(s,buf,sizeof(buf),0);
   if (i = SOCKET_ERROR) then goto ex;


 
Piter ©   (2004-10-02 21:00) [3]

Коннектишься к хосту (да хотя бы обычным TClientSocket), выдранному из URL по определенному порту (зачастую 80) и передаешь комманды, ждешь ответа. Вот например перехват трафика для этого сайта при запросе страниц.
Это посылается серверу после коннекта:

GET http://delphimaster.net/view/15-1074376310/
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/msword, application/x-shockwave-flash, */*
Accept-Language: ru
Cookie: small_thread=0; delphi_name=[ИМЯ]; delphi_email=; id=[тут должно быть нечто]; lg=[тут должно быть нечто]; ChatColor=EF4F78
User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0; MyIE2)
Host: www.delphimaster.ru
Proxy-Connection: Keep-Alive


Соответственно

1) GET <имя странички которую хочу>. Тут все понятно
2) Accept <bla-bla> это вроде того, что ты готов принять. Можешь писать здесь все подряд, мол готов принять все :)
3) Accept-Language: ru - сообщаешь свой язык. Теоретически сервер может выдавать разныую инфу для разных языков. Но по-моему, это не используется. Или очень редко
4) Cookie: <bla-bla> - сообщаешь свои куки для этого сайта. Это чтобы в поле ответа в "Ваше имя" сервер подставил что надо.
Подозреваю, что id и lg используется, чтобы не вводить пароль каждый раз.
5) User-Agent: <bla-bla> - пишешь какая программа посылает запрос (тут броузер пишет свою идентификацию, Опера например нетскейпом может прикинуться). Опять же теоретически сервер может выдавать разную инфу для разныз броузеров, но это редко используется.
6) Host: www.delphimaster.ru - хост, куда коннектился. По-моему, можно и не указывать, мало кто использует данную информацию
7) Proxy-Connection: Keep-Alive - чтобы прокси (если через нее соединение идет) не кешировала данный запрос.
В общем то и все.
А, вспомнил! После GET"а ты должен послать код перевода строки (в Delphi это #13#10). После запроса должен послать два кода перевода строки. После чего ждешь ответа.

А вот пример ответа:

HTTP/1.1 200 OK
|перевод строки|
Via: 1.0 MAIL
Proxy-Connection: Keep-Alive
Content-Length: 12479
Content-Type: text/html; charset=windows-1251
Server: 0W/0.6d
Date: Tue, 12 Aug 2003 18:01:08 GMT
charset: windows-1251

|двойной перевод строки>|

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
<TITLE>Мастера DELPHI
.....
<и дальше пошел текст странички>


Ну тут понятно. "HTTP/1.1 200 OK" - означает что сервер обработал успешно запрос и сча тебе инфа посыпится :)
После этого идет код перевода строки.
Via: 1.0 MAIL - не знаю что это. Может, McSimm разъяснит
Content-Length: 12479 - длина самого текста странички, которая будет выдана.
charset=windows-1251 - кодирвока выдаваемой страницы
Ну остальное и так понятно
После заголовка идет код перевода строки (или два - не помню).

После чего посылается непосредственно текст страницы. Размер этого текста будет как раз равен Content-Length

Еще сервер может тебе выдать информацию архивированную, он об этом сообщит в заголовке параметром gzip. Это если ты попросишь.

---------------------------------------------------------------------------------------------------------------

А вот насчет поста, смотри пример:

POST http://www.beeonline.ru/servlet/send/sms/ HTTP/1.0
Accept-Language: ru,ja;q=0.5
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/4.7 [en] (Win95; I)
Referer: http://BeeOnLine-Express
Host: www.beeonline.ru
Content-Length: 91

[ПАРАМЕТРЫ]


Указываешь имя апплета, http://www.beeonline.ru/servlet/send/sms/
для этого форума будет http://www.delphimaster.ru/cgi-bin/forum.pl

После заголовка двойной перевод строки и идут параметры запроса.

Допустим нужно передать параметры name, email.
Ты хочешь передать их значения "Undert" и "noemail@noemail.com" соответственно.

Тогда вместо [ПАРМЕТРЫ] будет

name=undert&email=noemail@noemail.com

Никаких кавычек. Разделение между параметрами "&"

допустим, для ответа на вопрос в этом форуме надо передать параметры апплету http://www.delphimaster.ru/cgi-bin/forum.pl такие:

name, email, text, n, id

(может еще чего надо, все это можно посмотреть в исходном коде HTML этой страницы).

Да, еще один пункт, нельзя передавать значение параметров по русски. Ты наверное видел как они выглядят, типа "%CC%E0%F1%F2%E5%F0%E0+%C4%E5%EB%FC%F4%E8" - это означает "Мастера Дельфи"

Для перевода русского текста в нужные символы используй:

function EncodeContent(const msg : String) : String;
var
   I : Integer;
begin
   Result := "";
   for I := 1 to Length(msg) do begin
       if msg[I] = " " then
           Result := Result + "+"
       else if msg[I] in ["a".."z", "A".."Z", "0".."9"] then
           Result := Result + msg[I]
       else
           Result := Result + "%" + IntToHex(ord(msg[I]), 2);
   end;
end;


После чего можешь подставлять строку, возвращаемую этой функцией в параметр.


 
Луарвик   (2004-10-02 21:23) [4]

Ну, Piter, даешь! Это статья или ты просто так напсал? Спасибо конечно... И за function EncodeContent тож пасиба! И kaZaNoVa пасибо.
Форум конечно тут ништяк!


 
kaZaNoVa ©   (2004-10-02 21:49) [5]

главное про

> Content-Length:

не забыть .. :))
- у меня раньше трабла с ней была - что не писал ..


 
Луарвик   (2004-10-02 22:08) [6]

А еще!
POST http://www.beeonline.ru/servlet/send/sms/ HTTP/1.0 - разве так?
Я думал так: POST /servlet/send/sms/ HTTP/1.0, а http://www.beeonline.ru в значение idTCPClient.Host записываеться!


 
Луарвик   (2004-10-02 23:04) [7]

Не, не работает сволочь! Скрипт срабатывает, но параметры он не получает.
Вот я передаю две штуки test1=123&test2=456 на скрипт www.test2.ru/script.php таким образом:
with Form1.idTCPClient1 do
begin
Host:="www.test2.ru";
Port:=80;
Connect;
Writeln("POST /script.php HTTP/1.0");
writeln("Accept-Language: ru,ja;q=0.5");
writeln("Content-Type: application/x-www-form-urlencoded");
writeln("User-Agent: Mozilla/4.7 [en] (Win95; I)");
writeln("Host: www.test2.ru");
writeln("Connection: Keep-Alive");
Writeln("Content-Length: "+IntToStr(10));
Writeln;
WriteLn("test1=123&test2=456");
Disconnect;
end;

А скрипт в место того что б записать переменные в файл через пробел, записывает только один пробел. Че не так???


 
Луарвик   (2004-10-02 23:06) [8]

А, Writeln("Content-Length: "+IntToStr(19)); без разници!


 
Луарвик   (2004-10-03 12:18) [9]

Питер, подскажи!!!


 
kaZaNoVa ©   (2004-10-03 12:57) [10]

- попробуй запрос в телнете набрать . - может сервак глючит .. (у тебя локальный ? - апач ?)


 
Piter ©   (2004-10-03 13:02) [11]

Луарвик   (02.10.04 22:08) [6]
а http://www.beeonline.ru в значение idTCPClient.Host записываеться


в idTCPClient.Host записывается адрес машины куда ты будешь коннектиться. Это может быть как этот самый непосредственный сервер в сети, так и адрес прокси - если ты работаешь через прокси.

Host того сайта куда ты хочешь обратиться записывается параметром в HTTP заголовке, как ты это сделал:

writeln("Host: www.test2.ru");

этот параметр надо всегда указывать

Теперь насчет:

POST http://www.beeonline.ru/servlet/send/sms/ HTTP/1.0
и
POST /servlet/send/sms/ HTTP/1.0

если ты непосредственно соединяешься к серверу - то указывай без хоста, то есть просто /servlet/send/sms/
(при этом HTTP параметр "Host:" все равно надо указывать, иначе виртуальные сервера не поймут тебя). Если же коннектишься через прокси, то указывай полностью:
http://www.beeonline.ru/servlet/send/sms/

Луарвик   (03.10.04 12:18) [9]
Питер, подскажи!!!


а чего я тебе подскажу? ТЫ поподробнее расскажи чего делаешь, что не так, как проверяешь... откуда ты этот script.php взял? Может он неправильный...

А вообще, как минимум убери строчку
writeln("Connection: Keep-Alive");
если ты не знаешь, что она обозначает...


 
VMcL ©   (2004-10-03 13:05) [12]

>>Луарвик  (02.10.04 19:04)

Глянь исходники TIdHttp.


 
Piter ©   (2004-10-03 13:08) [13]

хех... ну ты простенько сказал - глянт исходнии TidHTTP :)))

Тогда уж лучше сразу RFC глянуть...


 
Луарвик   (2004-10-03 18:05) [14]


> [10] kaZaNoVa ©   (03.10.04 12:57)
> - попробуй запрос в телнете набрать . - может сервак глючит
> .. (у тебя локальный ? - апач ?)

У меня локальный апач из "Денвера-2". Не глючит. Точно.

> откуда ты этот script.php взял? Может он неправильный...

Это спец скрипт, созданый мною, для теста программы. Вот его содержание:
<?
echo  $text1." ".$text2;
$file = fopen("base.txt", "w");
fputs ($file, $text1." ".$text2);
?>

Он на 100% рабочий, так как при работе с Explorer-ом все ок. И с Оперой.


 
Piter ©   (2004-10-03 20:40) [15]

Луарвик   (03.10.04 18:05) [14]

а как ты с помощью Explorer проверяешь данный скрипт?!


 
kaZaNoVa ©   (2004-10-03 21:48) [16]

я тоже только что попробовал аналогичный код .. - тоже пробел ..


 
Piter ©   (2004-10-03 22:12) [17]

kaZaNoVa ©   (03.10.04 21:48) [16]

а проверь вот такой:

with Form1.idTCPClient1 do
begin
Host:="www.test2.ru";
Port:=80;
Connect;
Writeln("GET /script.php?test1=123&test2=456 HTTP/1.0");
writeln("Accept-Language: ru,ja;q=0.5");
writeln("Content-Type: application/x-www-form-urlencoded");
writeln("User-Agent: Mozilla/4.7 [en] (Win95; I)");
writeln("Host: www.test2.ru");
writeln("Connection: Keep-Alive");
Writeln("Content-Length: "+IntToStr(10));
Writeln;
Disconnect;
end;


 
kaZaNoVa ©   (2004-10-03 22:52) [18]

нашёл глюк ..
надо в скрипте:
<?
//echo $_POST["test2"]." ".$_POST["text2"];
$file = fopen("base.txt", "w");
fputs ($file, $_POST["test2"]." ".$_POST["test1"]);
?>


 
kaZaNoVa ©   (2004-10-03 22:53) [19]

но первоначальный вариант работает !!!
но тока от браузера почему-то ...
(http://сфше.org/script.php?text1=dfdf&text2=hjuhj)
а вот при коннекте idTCPClient1 не пашет - тока пробел ..  странно


 
kaZaNoVa ©   (2004-10-03 22:54) [20]

п.с. вариант [18] работает  с idTCPClient1 ...


 
kaZaNoVa ©   (2004-10-03 23:09) [21]

Луарвик   (03.10.04 18:05) [14]
<?
echo  $text1." ".$text2;
$file = fopen("base.txt", "w");
fputs ($file, $text1." ".$text2);
?>
ВОТ ГДЕ ГЛЮК !!!!!!!!1


 
kaZaNoVa ©   (2004-10-03 23:11) [22]

Гы, s и х  хе-хе  ... ;)))))))))
всё оказалось так просто ...


 
Луарвик   (2004-10-04 00:38) [23]


> <?
> echo  $text1." ".$text2;
> $file = fopen("base.txt", "w");
> fputs ($file, $text1." ".$text2);
> ?>
> ВОТ ГДЕ ГЛЮК !!!!!!!!1

3 минуты смотрел, так и не нашел глюка...


> Гы, s и х  хе-хе  ... ;)))))))))
> всё оказалось так просто ...

Что "просто"?


 
Луарвик   (2004-10-04 00:41) [24]

Ай, блин! Нашел, точно!!! Вот с тупил!
Пасибо всем!


 
Луарвик   (2004-10-04 00:54) [25]

Да! Еще вопрос: есть ли смысл, чтоб не вычеслять постоянно Content-Length, поставить в него сразу 999999 (макс. значение)? Какие последствия этого?


 
kaZaNoVa ©   (2004-10-04 02:16) [26]

Луарвик   (04.10.04 0:54) [25]
такие, что будешь передавать эти 999999  ...  - иначе сервак не поймёт .. (вернее поймёт неправильно)


 
Reindeer Moss Eater ©   (2004-10-04 12:22) [27]

Сервер будет пытаться прочитать все эти 999999 байт.
Пока не наступит таймаут.
После чего он отвергнет твой запрос.


 
Луарвик   (2004-10-04 14:35) [28]

Странно... Только что пробовал, все ок. Конечно не буду искушать судьбу.



Страницы: 1 вся ветка

Форум: "Сети";
Текущий архив: 2004.12.12;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.54 MB
Время: 0.035 c
1-1101876703
zunder
2004-12-01 07:51
2004.12.12
plug-in


14-1101352312
Думкин
2004-11-25 06:11
2004.12.12
С днем рождения! 25 ноября


1-1101399547
Санёк
2004-11-25 19:19
2004.12.12
Создание программ


4-1099132569
sirin
2004-10-30 14:36
2004.12.12
восстановление файлов


14-1100546201
Познающий БД
2004-11-15 22:16
2004.12.12
BDE: Какие файлы скопировать?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский