- Регистрация
- 9 Май 2015
- Сообщения
- 1,562
- Баллы
- 155
Сегодня максимально подробно поговорим о POST/GET запросах: что это такое, зачем нужно, как работает, где применяется.
Актуальность вопроса.
Почти для любой программы, работающей с сетью internet и протоколом http в частости, как-либо взаимодействующей с сайтами и ресурсами, необходимы запросы. Они используются почти везде: начиная от брутов, заканчивая API сайтов - миллионников, таких как mail, vk, google. В процессе программирования любой новичёк сталкивается с понятием запроса и изучает его. Обычно такое изучение происходит посредственно, вскользь, с девизом "лишь бы работало". А по-моему, это в корне не верно. Ведь что бы с чем-то работать на хорошем уровне, нужно понимать как это работает и представлять, что будут делать те или иные строчки вашего кода. Именно поэтому и написан нижеизложенный материал, главная цель которого - на пальцах показать принцип работы, способы реализации и примеры из практики.
Что это такое?
Все перечисленные ниже виды запросов (а их перечислено всего 2) - это HTTP методы, которые используются в http протоколе для различных нужд. HTTP протокол - протокол, позволяющий работать с сайтами на уровне запросов/ответов.
Все HTTP запросы состоят (или частично состоят) из 3-х частей:
- Строка запроса
- Заголовки запроса - передаются все заголовки (Host, User-Agent и прочее)
- Тело сообщения - указываются все данные, передаваемые на сайт (используется в POST, который будет рассмотрен ниже)
GET.
GET-запрос - это запрос, который при вызове вернёт данные запрошенного ресурса. Какие данные? Обычный html-код сайта. Приведу пример: вам понадобился исходный код какой-либо страницы, например - mail.ru. На форму кидаем компонент idHTTP и memo, а затем, в событии OnCreate у формы пишем следующее:
memo1.Text:= IdHTTP.Get('
Ставим свойство HandleRedirect у компонента IdHTTP на true и запускаем:
Как видим, исходный код страницы успешно получен. Вопросы: "А зачем это нужно" есть? Если есть, то объясняю - очень часто, при работе с каким-либо сайтом, нужно получить определённый данные из его кода, грубо говоря - спарсить, например - ссылку на определённый объект. Вот тут - без GET-запроса обойтись очень сложно.
В качестве параметра у процедуры GET передаётся ссылка на ресурс, исходный код которого нужно получить.
POST.
POST-запросы отличаются от GET тем, что передают что-либо в теле сообщения (как заметили, get никаких данных не передаёт - он лишь их запрашивае).
POST - запрос, передающий что-либо в формы (форма ввода логина, форма ввода пароля) сайта (в данном случае передаём логин и пароль). Именно такие типы запросов применяются чаще всего при авторизации на сайты, при написании гулялок и брутов. Вид запроса в delphi следующий:
http.pos('ссылка на сайт', массив данных);
Что может быть массивом данных? Например, да и чаще всего - объект типа TStringList, или, грубо говоря - обычный массив строк.
Для практики поставим задчу - авторизироваться на сайте pwcode.net. Запускаем сниффер, авторизируемся:
В сниффере находим POST-метод, открываем переданные параметры и видим, что при авторизации сайту передаётся 3 параметра - login_name, login_password, login. Всё тоже можно повторить и программно. Для этого объявляем переменную типа TStringList, кидаем на форму компонент idhttp, 2 edit'а и 1 button.
В событии onclick у компонента Button пишем:
var
data, results: TStringlist;
begin
data:= TStringlist.Create; //инициализируем массив строк для параметров
results:= TStringList.Create; //инициализируем массив строк для ответа
//Помните говорили о заголовках? Вот, это они. "Маскируемся" под браузер, грубо говоря
with idhttp.Request do
begin
UserAgent:='Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.13014 YaBrowser/13.12.1599.13014 Safari/537.36';
Host:='
ContentType:='application/x-www-form-urlencoded';
Connection:='keep-alive';
end;
//Передача нужных параметров
data.Add('login_name='+ edit1.Text);
data.Add('login_password='+ edit2.Text);
data.Add('login=submit');
//Отправка запроса
results.Text:= idhttp.Post('', data);
//Проверка, успешен ли запрос
if pos ('Панель управления', results.Text) <> 0 then ShowMessage('Авторизация успешна!');
end;
Как видим - всё просто. Результат будет тот же - всё успешно:
Выше мы рассмотрели что такое запросы и как их применять. Удачи в обучении и спасибо за внимание.