Проверка 200 кода ответа сервера через кубик HTTP Get [Дон шампиньон]

Lord_Alfred

Client
Регистрация
09.10.2015
Сообщения
3 916
Благодарностей
3 867
Баллы
113
Очень часто, при работе через GET/POST-запросы в ZennoPoster, я сталкиваюсь с тем, что мне нужно узнать какой ответ сервера пришел. Чаще всего я так проверяю просто на отсутствие 404 ошибки (точнее, на то, что страница при GET-запросе отдает 200 ответ сервера).
К сожалению, в текущей зенке не предусмотрено (на сколько мне известно) простое получение ответа сервера при работе через кубик HTTP Get, поэтому я запилил свою обработку ответа сервера. Причем обработку умную, чтоб она учитывала и редиректы тоже (чтоб пропускала их и смотрела только на окончательный ответ).

Выглядит данная обработка следующим образом:


С# код:
Код:
var resp = project.Variables["base_url_response"].Value;

string[] stringSeparators = new string[] {"\r\n\r\n"};
resp = resp.Trim();
String[] resps = resp.Split(stringSeparators, StringSplitOptions.RemoveEmptyEntries);
resp = resps[resps.Length-1];

resp = resp.Substring(0, resp.IndexOf('\n')+1);
resp = resp.ToLower();
resp = resp.Replace("  ", " "); // тут обязательно в первом аргументе у Replace должно быть 2 пробела - перепроверяйте!!!

return (resp.IndexOf("200 ok") > -1);
В данном сниппете вам нужно только поменять переменную base_url_response на свою, в которой содержится результат выполнения кубика HTTP Get (в котором загружаются только заголовки!).
Результат выполнения данного кода:

    • True - если страница вернула статус 200.
    • False - если пришел какой-либо другой ответ сервера.
Ещё раз отдельно замечу, что данный код - обрабатывает все редиректы и берет последний ответ от сервера, а не первый редирект.
В случае, если вам нужно получить и ответ сервера, и содержимое страницы - нужно чуть допилить сниппет. Если у кого-то возникнет такая ситуация - напишите в комментах, я скину исправленную версию.
 

one

Client
Регистрация
22.09.2015
Сообщения
6 833
Благодарностей
1 275
Баллы
113
Ну в принципе и без сниппета так же получается. В три экшена. GET, результат распаршиваем регуляркой и смотрим 200 там или не 200.
 

Lord_Alfred

Client
Регистрация
09.10.2015
Сообщения
3 916
Благодарностей
3 867
Баллы
113
Ну в принципе и без сниппета так же получается. В три экшена. GET, результат распаршиваем регуляркой и смотрим 200 там или не 200.
Можно и через регулярки, но тогда не очень прозрачно будет. А так - каждый шаг можно проконтролировать. Ну и при парсинге регуляркой - нужно не забыть ещё предварительно двойные пробелы убрать, затем сделать регулярку регистроНЕзависимой, а затем брать ПОСЛЕДНИЙ результат поиска регуляркой, а не первый :-)
 

ssXXXss

Client
Регистрация
23.12.2014
Сообщения
7 379
Благодарностей
2 041
Баллы
113
а для чего столько строк кода, все коды ошибок различаются, редиректы в основном 301 и 302, 500 ошибка, ну проверку сразу на 200ОК поставил да и всё
 
  • Спасибо
Реакции: zortexx

one

Client
Регистрация
22.09.2015
Сообщения
6 833
Благодарностей
1 275
Баллы
113
Можно и через регулярки, но тогда не очень прозрачно будет. А так - каждый шаг можно проконтролировать. Ну и при парсинге регуляркой - нужно не забыть ещё предварительно двойные пробелы убрать, затем сделать регулярку регистроНЕзависимой, а затем брать ПОСЛЕДНИЙ результат поиска регуляркой, а не первый :-)
GET последний результат и покажет. Разве нет?
 

Lord_Alfred

Client
Регистрация
09.10.2015
Сообщения
3 916
Благодарностей
3 867
Баллы
113
а для чего столько строк кода, все коды ошибок различаются, редиректы в основном 301 и 302, 500 ошибка, ну проверку сразу на 200ОК поставил да и всё
Потому что результат исполнения HTTP Get - это список ответов сервера.
Например, если выполнить этот кубик на http://ya.ru - будет вот такой результат:
Код:
HTTP/1.1 302 Found
Server: nginx
Date: Sun, 04 Dec 2016 16:45:34 GMT
Content-Length: 0
Connection: keep-alive
Cache-Control: no-cache,no-store,max-age=0,must-revalidate
Location: https://ya.ru/
Expires: Sun, 04 Dec 2016 16:45:34 GMT
Last-Modified: Sun, 04 Dec 2016 16:45:34 GMT
P3P: policyref="/w3c/p3p.xml", CP="NON DSP ADM DEV PSD IVDo OUR IND STP PHY PRE NAV UNI"
Set-Cookie: yandexuid=5354915741480869934; Expires=Wed, 02-Dec-2026 16:45:34 GMT; Domain=.ya.ru; Path=/

HTTP/1.1 200 Ok
Server: nginx
Date: Sun, 04 Dec 2016 16:45:34 GMT
Content-Type: text/html; charset=UTF-8
Transfer-Encoding: chunked
Connection: keep-alive
Cache-Control: no-cache,no-store,max-age=0,must-revalidate
Expires: Sun, 04 Dec 2016 16:45:34 GMT
Last-Modified: Sun, 04 Dec 2016 16:45:34 GMT
Content-Security-Policy: connect-src 'self' wss://webasr.yandex.net wss://push.yandex.ru wss://portal-xiva.yandex.net https://yastatic.net https://home.yastatic.net https://yandex.ru https://*.yandex.ru portal-xiva.yandex.net yastatic.net home.yastatic.net yandex.ru *.yandex.ru *.yandex.net yandex.st; default-src 'self' blob: wss://portal-xiva.yandex.net portal-xiva.yandex.net; font-src 'self' https://yastatic.net yastatic.net; frame-src 'self' https://www.youtube.com https://yastatic.net https://yandex.ru https://*.yandex.ru wfarm.yandex.net yastatic.net yandex.ru *.yandex.ru awaps.yandex.net *.cdn.yandex.net; img-src 'self' data: https://yastatic.net https://home.yastatic.net https://*.yandex.ru https://*.yandex.net https://*.tns-counter.ru *.yastatic.net yastatic.net home.yastatic.net yandex.ru *.yandex.ru *.yandex.net *.tns-counter.ru *.gemius.pl yandex.st; media-src 'self' blob: data: *.storage.yandex.net yastatic.net kiks.yandex.ru strm.yandex.ru; object-src 'self' *.yandex.net music.yandex.ru yastatic.net kiks.yandex.ru awaps.yandex.net storage.mds.yandex.net; report-uri https://csp.yandex.net/csp?from=yaru.ru&showid=1480869934.30577.22879.27086&h=s12&yandexuid=5354915741480869934; script-src 'self' 'unsafe-inline' 'unsafe-eval' https://suburban-widget.rasp.yandex.ru https://suburban-widget.rasp.yandex.net https://music.yandex.ru https://yastatic.net https://home.yastatic.net https://mc.yandex.ru https://pass.yandex.ru an.yandex.ru api-maps.yandex.ru yastatic.net home.yastatic.net yandex.ru www.yandex.ru mc.yandex.ru suggest.yandex.ru clck.yandex.ru awaps.yandex.net; style-src 'self' 'unsafe-inline' https://yastatic.net https://home.yastatic.net yastatic.net home.yastatic.net;
P3P: policyref="/w3c/p3p.xml", CP="NON DSP ADM DEV PSD IVDo OUR IND STP PHY PRE NAV UNI"
Set-Cookie: yp=1483461934.ygu.1; Expires=Wed, 02-Dec-2026 16:45:34 GMT; Domain=.ya.ru; Path=/
Set-Cookie: yandex_gid=12; Expires=Tue, 03-Jan-2017 16:45:34 GMT; Domain=.ya.ru; Path=/
X-Frame-Options: DENY
Content-Encoding: gzip
И вся суть кроется в деталях. Если просто делать проверку на строку "200 OK", то такое совпадаение может быть в других заголовках (хоть в set-cookie, например). А если делать с HTTP/1.1 - то уже надо разбирать 1.1 или 1.0 или ещё какой-то другой. Причем, код ответа сервера всегда на первом месте: а в приведенном выше примере - это редирект, хотя после редиректа 200 ответ.

Вообщем, надеюсь, развеял ваши мысли о том, что можно просто сделать проверку в лоб? Нет, конечно, можно ещё поспорить, но с точки зрения обработки ислючительных ситуаций - мой код будет более правильным (но не идеальным!), в отличии от обработки регулярками или поиском "200 OK".
 

Lord_Alfred

Client
Регистрация
09.10.2015
Сообщения
3 916
Благодарностей
3 867
Баллы
113

ssXXXss

Client
Регистрация
23.12.2014
Сообщения
7 379
Благодарностей
2 041
Баллы
113
Потому что результат исполнения HTTP Get - это список ответов сервера.
Например, если выполнить этот кубик на http://ya.ru - будет вот такой результат:
Код:
HTTP/1.1 302 Found
Server: nginx
Date: Sun, 04 Dec 2016 16:45:34 GMT
Content-Length: 0
Connection: keep-alive
Cache-Control: no-cache,no-store,max-age=0,must-revalidate
Location: https://ya.ru/
Expires: Sun, 04 Dec 2016 16:45:34 GMT
Last-Modified: Sun, 04 Dec 2016 16:45:34 GMT
P3P: policyref="/w3c/p3p.xml", CP="NON DSP ADM DEV PSD IVDo OUR IND STP PHY PRE NAV UNI"
Set-Cookie: yandexuid=5354915741480869934; Expires=Wed, 02-Dec-2026 16:45:34 GMT; Domain=.ya.ru; Path=/

HTTP/1.1 200 Ok
Server: nginx
Date: Sun, 04 Dec 2016 16:45:34 GMT
Content-Type: text/html; charset=UTF-8
Transfer-Encoding: chunked
Connection: keep-alive
Cache-Control: no-cache,no-store,max-age=0,must-revalidate
Expires: Sun, 04 Dec 2016 16:45:34 GMT
Last-Modified: Sun, 04 Dec 2016 16:45:34 GMT
Content-Security-Policy: connect-src 'self' wss://webasr.yandex.net wss://push.yandex.ru wss://portal-xiva.yandex.net https://yastatic.net https://home.yastatic.net https://yandex.ru https://*.yandex.ru portal-xiva.yandex.net yastatic.net home.yastatic.net yandex.ru *.yandex.ru *.yandex.net yandex.st; default-src 'self' blob: wss://portal-xiva.yandex.net portal-xiva.yandex.net; font-src 'self' https://yastatic.net yastatic.net; frame-src 'self' https://www.youtube.com https://yastatic.net https://yandex.ru https://*.yandex.ru wfarm.yandex.net yastatic.net yandex.ru *.yandex.ru awaps.yandex.net *.cdn.yandex.net; img-src 'self' data: https://yastatic.net https://home.yastatic.net https://*.yandex.ru https://*.yandex.net https://*.tns-counter.ru *.yastatic.net yastatic.net home.yastatic.net yandex.ru *.yandex.ru *.yandex.net *.tns-counter.ru *.gemius.pl yandex.st; media-src 'self' blob: data: *.storage.yandex.net yastatic.net kiks.yandex.ru strm.yandex.ru; object-src 'self' *.yandex.net music.yandex.ru yastatic.net kiks.yandex.ru awaps.yandex.net storage.mds.yandex.net; report-uri https://csp.yandex.net/csp?from=yaru.ru&showid=1480869934.30577.22879.27086&h=s12&yandexuid=5354915741480869934; script-src 'self' 'unsafe-inline' 'unsafe-eval' https://suburban-widget.rasp.yandex.ru https://suburban-widget.rasp.yandex.net https://music.yandex.ru https://yastatic.net https://home.yastatic.net https://mc.yandex.ru https://pass.yandex.ru an.yandex.ru api-maps.yandex.ru yastatic.net home.yastatic.net yandex.ru www.yandex.ru mc.yandex.ru suggest.yandex.ru clck.yandex.ru awaps.yandex.net; style-src 'self' 'unsafe-inline' https://yastatic.net https://home.yastatic.net yastatic.net home.yastatic.net;
P3P: policyref="/w3c/p3p.xml", CP="NON DSP ADM DEV PSD IVDo OUR IND STP PHY PRE NAV UNI"
Set-Cookie: yp=1483461934.ygu.1; Expires=Wed, 02-Dec-2026 16:45:34 GMT; Domain=.ya.ru; Path=/
Set-Cookie: yandex_gid=12; Expires=Tue, 03-Jan-2017 16:45:34 GMT; Domain=.ya.ru; Path=/
X-Frame-Options: DENY
Content-Encoding: gzip
И вся суть кроется в деталях. Если просто делать проверку на строку "200 OK", то такое совпадаение может быть в других заголовках (хоть в set-cookie, например). А если делать с HTTP/1.1 - то уже надо разбирать 1.1 или 1.0 или ещё какой-то другой. Причем, код ответа сервера всегда на первом месте: а в приведенном выше примере - это редирект, хотя после редиректа 200 ответ.

Вообщем, надеюсь, развеял ваши мысли о том, что можно просто сделать проверку в лоб? Нет, конечно, можно ещё поспорить, но с точки зрения обработки ислючительных ситуаций - мой код будет более правильным (но не идеальным!), в отличии от обработки регулярками или поиском "200 OK".
ничем новым не разъвеял и в каких ещё таких заголовках куки может такое находиться, если уже об этом говорить то тогда для зенки лучше свой класс написать, вот есть сайты где по 5 заголовков выдаёт и чтвой пример в этом случае будет делать ???
 
  • Спасибо
Реакции: zortexx

Lord_Alfred

Client
Регистрация
09.10.2015
Сообщения
3 916
Благодарностей
3 867
Баллы
113
ничем новым не разъвеял и в каких ещё таких заголовках куки может такое находиться, если уже об этом говорить то тогда для зенки лучше свой класс написать, вот есть сайты где по 5 заголовков выдаёт и чтвой пример в этом случае будет делать ???
А ты умеешь что-то другое, кроме как придти и обоссать? Ты меня спросил - я тебе ответил. Теперь может что-то своё внесешь, свой вклад сделаешь?

PS: если будет 5 заголовков (редиректов), то возьмется пятый ответ. Таких исключительных ситуаций можно придумать очень много, я выше написал уже что мой код хорошее решение, но не идеальное.
 
  • Спасибо
Реакции: donkasstro и doc

ssXXXss

Client
Регистрация
23.12.2014
Сообщения
7 379
Благодарностей
2 041
Баллы
113
А ты умеешь что-то другое, кроме как придти и обоссать? Ты меня спросил - я тебе ответил. Теперь может что-то своё внесешь, свой вклад сделаешь?
а зачем делать если давно есть классы готовые по таким ошибкам которые можно выдернуть из инета многих реализаций и под себя запилить, так же можно самому написать, покажи где тебя я обоссал ??
 

Lord_Alfred

Client
Регистрация
09.10.2015
Сообщения
3 916
Благодарностей
3 867
Баллы
113
а зачем делать если давно есть классы готовые по таким ошибкам которые можно выдернуть из инета многих реализаций и под себя запилить, так же можно самому написать, покажи где тебя я обоссал ??
Я бы с удовольствием взглянул на такой готовый класс парсинга http response, который можно заюзать без заморочек и он не был бы слишком увесистым для такого простого действия.
 

ssXXXss

Client
Регистрация
23.12.2014
Сообщения
7 379
Благодарностей
2 041
Баллы
113
PS: если будет 5 заголовков (редиректов), то возьмется пятый ответ. Таких исключительных ситуаций можно придумать очень много, я выше написал уже что мой код хорошее решение, но не идеальное.
а зачем мне 5-тый есмне имено редирект нужен, а имено location
 

Lord_Alfred

Client
Регистрация
09.10.2015
Сообщения
3 916
Благодарностей
3 867
Баллы
113

ssXXXss

Client
Регистрация
23.12.2014
Сообщения
7 379
Благодарностей
2 041
Баллы
113
Ок, и что ты будешь делать?
ну думаю для начала бы проверить на критические коды ошибок, потом редиректы а потом уже 200 ОК, в твоём случае если 10 гетов будет в проекте то это 10 ещё кубиков лишних, то думаю проще будет написать класс, да и класс легче таскать по общему коду и вызывать одной строкой думаю много места не займёт у тебя, а так как коды ошибок фиксированые и ни нами придуманые и не хозяином сайта то отталкиваясь от них мы уже можем себе написать код обработки Exception

я тебе просто вопрос задал и ты прям резко смотрю такой злой стал как будто я у тебя 10 шаблонов купил и не заплатил ), я ведь не написал что это плохо а просто спросил для чего столько строк кода
 
  • Спасибо
Реакции: zortexx и Sanekk

Lord_Alfred

Client
Регистрация
09.10.2015
Сообщения
3 916
Благодарностей
3 867
Баллы
113
ну думаю для начала бы проверить на критические коды ошибок, потом редиректы а потом уже 200 ОК, в твоём случае если 10 гетов будет в проекте то это 10 ещё кубиков лишних, то думаю проще будет написать класс, да и класс легче таскать по общему коду и вызывать одной строкой думаю много места не займёт у тебя, а так как коды ошибок фиксированые и ни нами придуманые и не хозяином сайта то отталкиваясь от них мы уже можем себе написать код обработки Exception

я тебе просто вопрос задал и ты прям резко смотрю такой злой стал как будто я у тебя 10 шаблонов купил и не заплатил ), я ведь не написал что это плохо а просто спросил для чего столько строк кода
По поводу злой стал - да, я не люблю когда критикуют и не предлагают своего решения (а не просто на словах расписывают, что можно вот так и так).

По поводу обработки кртичических кодов - уже давно придуман порядок обработки кодов, в спецификации протокола HTTP можно почитать.

По поводу 10 гетов и 10 кубиков лишних - да, тут согласен, что это не удобно, но в любом случае, если даже юзать общий код, то после кубика HTTP Get в любом случае будет кубик обработки результата (C# код, который юзает класс из общего кода).

И наконец, по поводу стольких строчек кода - я же написал зачем, описал что за обработки и привел пример. Естественно ты дал контр аргумент, на который я ответил ещё раньше - код рабочий, но не идеальный (с точки зрения обработки абсолютно всех ошибок и исключений).



И для всех остальных: если интересно посмотреть как может вырасти маленькая библиотечка для работы с HTTP (когда кажется, что обработка ответа сервера - это 3 кубика или 5 строчек), советую найти библиотеку Requests для Python, и затем посмотреть её исходный код. Чувак изначально тоже хотел сделать небольшую библиотеку для работы с HTTP (отправка запросов и парсинг результатов), а вышел монстр, но очень функциональный и удобный (спасибо питону). А питон тут как раз примичателен тем, что там всё очень лаконично и достаточно синтаксического сахара для того, чтоб сократить кучу конструкций в коде.
 

Valiksim

Client
Регистрация
14.04.2012
Сообщения
1 344
Благодарностей
298
Баллы
83
Интересно, а как можно выловить Get-запрос, в случае, когда надо поймать то, что открывается в popup-вкладке?
Я не силён в данных вопросах, так что сильно не пинайте
 

yuresd

Client
Регистрация
09.12.2014
Сообщения
97
Благодарностей
120
Баллы
33
Спасибо за реализацию, давно искал такую!
Подскажите, почему выдает такую ошибку
"Выполнение действия CSharp OwnCode Индекс находился вне границ массива." Я подцепил список доменов, он не пустой и ошибка то возникает, то нет.

UP судя по всему, ошибка возникает, когда появляются такие домены 0-23.RU которые не отдают ответа сервера вообще.
 
Последнее редактирование:

Severip

Client
Регистрация
17.10.2013
Сообщения
346
Благодарностей
98
Баллы
28
Lord_Alfred, спасибо за реализацию в кубике! Все время приходится чекать сайты, так что вопрос насущный.
Можно тебя попросить сделать вариант, чтобы могло работать и с заголовками и с содержимым?
 

Lord_Alfred

Client
Регистрация
09.10.2015
Сообщения
3 916
Благодарностей
3 867
Баллы
113
Lord_Alfred, спасибо за реализацию в кубике! Все время приходится чекать сайты, так что вопрос насущный.
Можно тебя попросить сделать вариант, чтобы могло работать и с заголовками и с содержимым?
Сходу не предложу вариант, когда заголовки+содержимое + возможен редирект. Если редиректа нету (отключена галочка), то такое не проблема сделать, но вариант не совсем корректный будет, к сожалению. С редиректом как-то сложнее из-за конкатенации через \n\n, т.к. такое и в содержимом может быть
 

Severip

Client
Регистрация
17.10.2013
Сообщения
346
Благодарностей
98
Баллы
28
Ок, все-равно спасибо!
 

z@jivalo

Client
Регистрация
27.12.2016
Сообщения
800
Благодарностей
179
Баллы
43
А как быть в случае если пришел пустой ответ?
он выдаст ошибку Index was outside the bounds of the array.
Бывают такие дохлые домены
 

Lord_Alfred

Client
Регистрация
09.10.2015
Сообщения
3 916
Благодарностей
3 867
Баллы
113
А как быть в случае если пришел пустой ответ?
он выдаст ошибку Index was outside the bounds of the array.
Бывают такие дохлые домены
Предварительно проверять ответ на пустоту можно, самое простое и верное решение
 

z@jivalo

Client
Регистрация
27.12.2016
Сообщения
800
Благодарностей
179
Баллы
43
Lord_Alfred спасибо сохранил в снипеты)
 

Rimen

Client
Регистрация
28.10.2019
Сообщения
406
Благодарностей
254
Баллы
63
Очень часто, при работе через GET/POST-запросы в ZennoPoster, я сталкиваюсь с тем, что мне нужно узнать какой ответ сервера пришел. Чаще всего я так проверяю просто на отсутствие 404 ошибки (точнее, на то, что страница при GET-запросе отдает 200 ответ сервера).
К сожалению, в текущей зенке не предусмотрено (на сколько мне известно) простое получение ответа сервера при работе через кубик HTTP Get, поэтому я запилил свою обработку ответа сервера. Причем обработку умную, чтоб она учитывала и редиректы тоже (чтоб пропускала их и смотрела только на окончательный ответ).

Выглядит данная обработка следующим образом:


С# код:
Код:
var resp = project.Variables["base_url_response"].Value;

string[] stringSeparators = new string[] {"\r\n\r\n"};
resp = resp.Trim();
String[] resps = resp.Split(stringSeparators, StringSplitOptions.RemoveEmptyEntries);
resp = resps[resps.Length-1];

resp = resp.Substring(0, resp.IndexOf('\n')+1);
resp = resp.ToLower();
resp = resp.Replace("  ", " "); // тут обязательно в первом аргументе у Replace должно быть 2 пробела - перепроверяйте!!!

return (resp.IndexOf("200 ok") > -1);
В данном сниппете вам нужно только поменять переменную base_url_response на свою, в которой содержится результат выполнения кубика HTTP Get (в котором загружаются только заголовки!).
Результат выполнения данного кода:

    • True - если страница вернула статус 200.
    • False - если пришел какой-либо другой ответ сервера.
Ещё раз отдельно замечу, что данный код - обрабатывает все редиректы и берет последний ответ от сервера, а не первый редирект.
В случае, если вам нужно получить и ответ сервера, и содержимое страницы - нужно чуть допилить сниппет. Если у кого-то возникнет такая ситуация - напишите в комментах, я скину исправленную версию.
Код рабочий, потребность решает.
Рекомендую
 

Дмитрий202020

Активный пользователь
Регистрация
15.09.2020
Сообщения
278
Благодарностей
67
Баллы
28
Подскажите пожалуйста почему не работает сниппет на версии 7.6.0.0 зенки.Если не трудно можно актуальный код пожалуйста
 
  • Спасибо
Реакции: ledsan

Кто просматривает тему: (Всего: 5, Пользователи: 0, Гости: 5)