Як відправляти POST запит програмою ZennoPoster

Коли потрібно одержати дані від сервера – використовується 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. Проте, думаю до цієї теми потрібно буде ще повернутись в майбутніх публікаціях про підготовку даних для відправки запитів.

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *