Коли потрібно одержати дані від сервера – використовується HTTP метод GET. Нам, як автоматизаторам в програмі ZennoPoster, вибору не дано – потребує сайт запит методом GET – відправляємо його. Потребує передати дані методом POST – будь-ласка – сформуємо і відправимо. Просто потрібно розуміти також, що запити бувають ідемпотентні, а бувають не ідемпотентні. Тобто, якщо це HTTP метод GET, і нам попався не робочий проксі сервер, то ZennoPoster можливо його продублює ще декілька разів. З методом POST така поведінка не допустима (але ми не можемо це знати на 100% як себе поведе ZennoPoster).
Так от, самий простий спосіб відправити запит методом POST – використати приблизно такий фрагмент коду:
string url = "https://httpbin.org/post"; // https://nghttp2.org/httpbin/post string content = "key=value&key=value"; string content_type = "application/x-www-form-urlencoded"; return ZennoPoster.HttpPost(url, content, content_type);
В ньому приймає участь URL на який буде відправлений запит, content, який буде відправлено в тілі запиту і тип даних, в якому буде відправлено цей контент. Всі інші дані, такі як UserAgent, заголовки ZennoPoster підставить автоматично з профіля, який створюється в момент запуску проєкта.
Звичайно, що коли нам потрібно добавити якісь свої заголовки, чи наприклад використовувати проксі сервер, то нам потрібно підставити ці дані. Також, як і у GET запитах ми можемо вказувати в якому вигляді нам хочеться отримати результат – з заголовками чи без. Нижче можливі варіанти:
var type = ZennoLab.InterfacesLibrary.Enums.Http.ResponceType.HeaderOnly; // Тільки заголовки var type = ZennoLab.InterfacesLibrary.Enums.Http.ResponceType.BodyOnly; // Тільки дані var type = ZennoLab.InterfacesLibrary.Enums.Http.ResponceType.HeaderAndBody; // Заголовки і дані var type = ZennoLab.InterfacesLibrary.Enums.Http.ResponceType.File; // Файл var type = ZennoLab.InterfacesLibrary.Enums.Http.ResponceType.FileAndHeaders; // Заголовки і файл
Тому, цей фрагмент коду може виглядати більш розширено, щоб одержати можливість керувати іншими параметрами запиту.
Спочатку потрібно підготувати всі необхідні аргументи, а після чого визвати інструкцію, яка відправить запит HTTP методом POST.
string url = "https://httpbin.org/post"; string content = "key=value&key=value"; string content_type = "application/x-www-form-urlencoded"; string proxy = string.Empty; string encoding =Encoding.UTF8.WebName; var type = ZennoLab.InterfacesLibrary.Enums.Http.ResponceType.BodyOnly; // Тільки дані string cookie = "key_1=value_1;key_2=value_2"; string UserAgent = project.Profile.UserAgent; string [] headers = new[]{"Key: Value","Key2: Value2","Key3: Value3"}; string text = ZennoPoster.HttpPost( url: url, // на який адрес буде відправлено запит content: content, // який контент буде відправлено в тілі запиту contentPostingType: content_type, // який тип даних буде відправлено proxy: proxy, // через який IP відправляти запит Encoding: encoding, // в якому кодуванні відправляти запит respType: type, // в якому вигляді повернути результат Timeout: 30000, // очікувати на відповідь від сервера Cookies: cookie, // добавити заголовок з cookie UserAgent: UserAgent, // використовувати свій UserAgent UseRedirect: false, // не слідувати php переадресаціям AdditionalHeaders:headers, // добавити додаткові заголовки DownloadPath: null, // папка до файла з результатом UseOriginalUrl: true // не змінювати параметри url ); return text;
Так як розробники вирішили в якийсь час переписати реалізацію відправки запитів, то код, який був вказаний вище вважається устарівшим, і для нових проєктів рекомендується використовувати той, який я привів нижче. Проте, у деяких випадках все таки використовуємо і один і другий варіант. Пов’язано це з тим, що інколи один спосіб добавляє лишні заголовки, чи змінює параметри URL, чи добавляє там лишні символи. Із-зі чого відправлений запит може сприйматись на сервері не корректним, і повертати помилку – саме тоді потрібно попробувати відправляти запити іншими варіантами реалізації.
var method = ZennoLab.InterfacesLibrary.Enums.Http.HttpMethod.POST; string url = "https://nghttp2.org/httpbin/post?key1=value1&key2=value2"; string content = "key=value&key=value"; string content_type = "application/x-www-form-urlencoded"; string proxy = string.Empty; string encoding =Encoding.UTF8.WebName; var type = ZennoLab.InterfacesLibrary.Enums.Http.ResponceType.BodyOnly; string cookie = "key_1=value_1;key_2=value_2"; string UserAgent = project.Profile.UserAgent; string [] headers = new[]{"Key: Value","Key2: Value2","Key3: Value3"}; var CookieContainer = project.Profile.CookieContainer; string text = ZennoPoster.HTTP.Request( method: method, // метод яким буде відправлено запит url: url,// по якому адресу буде відправлено запит content: content, // які дані буде відправляти запит contentPostingType: content_type, // який тип контенту буде відправляти запит proxy: proxy, // з якого IP відправляти запит Encoding: encoding, // в якому кодуванні відправляти запит respType: type, // в якому вигляді повернути результат Timeout: 30000, // скільки часу очікувати результат Cookies: cookie, // використовувати додаткові cookie UserAgent: UserAgent, // використовувати вказаний UserAgent UseRedirect: false, // включити слідування переадресаціям MaxRedirectCount: 0, // слідувати php переадресаціям AdditionalHeaders: headers, // добавити заголовки до цього запиту DownloadPath: null, // шлях до папки для збереження результату UseOriginalUrl: true, // не змінювати параметри запиту throwExceptionOnError: true, // генерувати помилку якщо не одержали результат cookieContainer: CookieContainer, // використання контейнера для cookie removeDefaultHeaders: true // видалення стандартних заголовків );
Як і при відправці GET запитів, так і POST є можливість в ProjectMaker указати Стандартний чи Альтернативний спосіб відправки запитів, який відрізняється реалізацією, тобто результат який буде одержано від сервера може відрізнятись. Тому, коли відправляємо запит і одержуємо результат який нас не влаштовує – то приходиться перемикати налаштування і пробувати іншим способом – в деяких випадках це дійсно допомогає.
При відправці запитів методом POST потрібно враховувати також content_type – він може бути різним. В цій публікації я привів варіант, який використовується найчастіше і в тому вигляді, в якому його використовують розробники, які пишуть проєкти в ZennoPoster. Проте, думаю до цієї теми потрібно буде ще повернутись в майбутніх публікаціях про підготовку даних для відправки запитів.