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

Lord_Alfred

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

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


С# код:
Код:
Развернуть Свернуть Копировать
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 - если пришел какой-либо другой ответ сервера.
Ещё раз отдельно замечу, что данный код - обрабатывает все редиректы и берет последний ответ от сервера, а не первый редирект.
В случае, если вам нужно получить и ответ сервера, и содержимое страницы - нужно чуть допилить сниппет. Если у кого-то возникнет такая ситуация - напишите в комментах, я скину исправленную версию.
 
Ну в принципе и без сниппета так же получается. В три экшена. GET, результат распаршиваем регуляркой и смотрим 200 там или не 200.
 
Ну в принципе и без сниппета так же получается. В три экшена. GET, результат распаршиваем регуляркой и смотрим 200 там или не 200.
Можно и через регулярки, но тогда не очень прозрачно будет. А так - каждый шаг можно проконтролировать. Ну и при парсинге регуляркой - нужно не забыть ещё предварительно двойные пробелы убрать, затем сделать регулярку регистроНЕзависимой, а затем брать ПОСЛЕДНИЙ результат поиска регуляркой, а не первый :)
 
а для чего столько строк кода, все коды ошибок различаются, редиректы в основном 301 и 302, 500 ошибка, ну проверку сразу на 200ОК поставил да и всё
 
  • Спасибо
Реакции: zortexx
Можно и через регулярки, но тогда не очень прозрачно будет. А так - каждый шаг можно проконтролировать. Ну и при парсинге регуляркой - нужно не забыть ещё предварительно двойные пробелы убрать, затем сделать регулярку регистроНЕзависимой, а затем брать ПОСЛЕДНИЙ результат поиска регуляркой, а не первый :-)
GET последний результат и покажет. Разве нет?
 
а для чего столько строк кода, все коды ошибок различаются, редиректы в основном 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".
 
Потому что результат исполнения 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
ничем новым не разъвеял и в каких ещё таких заголовках куки может такое находиться, если уже об этом говорить то тогда для зенки лучше свой класс написать, вот есть сайты где по 5 заголовков выдаёт и чтвой пример в этом случае будет делать ???
А ты умеешь что-то другое, кроме как придти и обоссать? Ты меня спросил - я тебе ответил. Теперь может что-то своё внесешь, свой вклад сделаешь?

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

а зачем мне 5-тый есмне имено редирект нужен, а имено location
 
Ок, и что ты будешь делать?
ну думаю для начала бы проверить на критические коды ошибок, потом редиректы а потом уже 200 ОК, в твоём случае если 10 гетов будет в проекте то это 10 ещё кубиков лишних, то думаю проще будет написать класс, да и класс легче таскать по общему коду и вызывать одной строкой думаю много места не займёт у тебя, а так как коды ошибок фиксированые и ни нами придуманые и не хозяином сайта то отталкиваясь от них мы уже можем себе написать код обработки Exception

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

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

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

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

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



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

UP судя по всему, ошибка возникает, когда появляются такие домены 0-23.RU которые не отдают ответа сервера вообще.
 
Последнее редактирование:
Lord_Alfred, спасибо за реализацию в кубике! Все время приходится чекать сайты, так что вопрос насущный.
Можно тебя попросить сделать вариант, чтобы могло работать и с заголовками и с содержимым?
 
Lord_Alfred, спасибо за реализацию в кубике! Все время приходится чекать сайты, так что вопрос насущный.
Можно тебя попросить сделать вариант, чтобы могло работать и с заголовками и с содержимым?
Сходу не предложу вариант, когда заголовки+содержимое + возможен редирект. Если редиректа нету (отключена галочка), то такое не проблема сделать, но вариант не совсем корректный будет, к сожалению. С редиректом как-то сложнее из-за конкатенации через \n\n, т.к. такое и в содержимом может быть
 
Ок, все-равно спасибо!
 
А как быть в случае если пришел пустой ответ?
он выдаст ошибку Index was outside the bounds of the array.
Бывают такие дохлые домены
 
А как быть в случае если пришел пустой ответ?
он выдаст ошибку Index was outside the bounds of the array.
Бывают такие дохлые домены
Предварительно проверять ответ на пустоту можно, самое простое и верное решение
 
Очень часто, при работе через GET/POST-запросы в ZennoPoster, я сталкиваюсь с тем, что мне нужно узнать какой ответ сервера пришел. Чаще всего я так проверяю просто на отсутствие 404 ошибки (точнее, на то, что страница при GET-запросе отдает 200 ответ сервера).
К сожалению, в текущей зенке не предусмотрено (на сколько мне известно) простое получение ответа сервера при работе через кубик HTTP Get, поэтому я запилил свою обработку ответа сервера. Причем обработку умную, чтоб она учитывала и редиректы тоже (чтоб пропускала их и смотрела только на окончательный ответ).

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


С# код:
Код:
Развернуть Свернуть Копировать
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 - если пришел какой-либо другой ответ сервера.
Ещё раз отдельно замечу, что данный код - обрабатывает все редиректы и берет последний ответ от сервера, а не первый редирект.
В случае, если вам нужно получить и ответ сервера, и содержимое страницы - нужно чуть допилить сниппет. Если у кого-то возникнет такая ситуация - напишите в комментах, я скину исправленную версию.
Код рабочий, потребность решает.
Рекомендую
 
Подскажите пожалуйста почему не работает сниппет на версии 7.6.0.0 зенки.Если не трудно можно актуальный код пожалуйста
 
  • Спасибо
Реакции: ledsan

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