- Регистрация
- 07.09.2015
- Сообщения
- 557
- Реакции
- 555
- Баллы
- 93
Приветствую всех!
В статье рассмотрим примеры работы с библиотекой Leaf.xNet, являющейся форком xNet.
Из коробки доступны следующие методы:
- GET
- POST
- PATCH
- DELETE
- PUT
- OPTIONS
Подключаем библиотеку:
- Leaf.xNet.dll копируем в папку ExternalAssemblies
- Добавляем в GAC
- Прописываем в Директивы using и общий код:
C#:
using Leaf.xNet; // dll
using HttpStatusCode = Leaf.xNet.HttpStatusCode; // debug request
using System.Net; // cookie
Для работы с запросами можно использовать две конструкции.
///++++++++++++++++++++++++++++++++++++++++++
/// Конструкция работы с запросом #1: using
///++++++++++++++++++++++++++++++++++++++++++
C#:
using (var request = new HttpRequest())
{
request.Get("https://zennolab.com");
}
Преимущества:
- Короткая запись если необходимо сделать простой запрос;
- Используя using, нам не нужно закрывать (dispose) запрос;
C#:
HttpRequest request = null;
using (request)
{
var resp = request.Get("http://google.com/file.zip");
resp.ToFile("C:\\myDownloadedFile.zip");
}
///++++++++++++++++++++++++++++++++++++++++++
/// Конструкция работы с запросом #2: try, catch, finally
///++++++++++++++++++++++++++++++++++++++++++
Эта конструкция позволяет использовать более детальный формат сообщений об ошибках, таким образом, можно продумать разные сценарии на каждый тип ошибки.
C#:
HttpRequest request = null;
try
{
}
catch (HttpException ex)
{
project.SendErrorToLog(String.Format("HttpException: {0}", ex.Message)), true);
switch (ex.Status)
{
case HttpExceptionStatus.Other:
project.SendErrorToLog("Unknown error", true);
break;
case HttpExceptionStatus.ProtocolError:
project.SendErrorToLog(String.Format("Status code: {0}", (int)ex.HttpStatusCode)), true);
break;
case HttpExceptionStatus.ConnectFailure:
project.SendErrorToLog("Failed to connect to the HTTP-server.", true);
break;
case HttpExceptionStatus.SendFailure:
project.SendErrorToLog("Failed to send request to HTTP-server.", true);
break;
case HttpExceptionStatus.ReceiveFailure:
project.SendErrorToLog("Failed to load response from HTTP-server.", true);
break;
}
}
finally
{
request.Dispose();
}
В подобной конструкции необходимо всегда закрывать запрос, это делается через finally.
///++++++++++++++++++++++++++++++++++++++++++
/// Отладка запроса
///++++++++++++++++++++++++++++++++++++++++++
Помимо отладки ошибок запроса через конструкцию catch, мы можем также отладить ответ в конструкции try.
К примеру, по какой-то причине могут тупить прокси или сервер, к которому идет обращение. В этом случае можно воспользоваться следующей конструкцией внутри try.
C#:
HttpRequest request = null;
request.IgnoreProtocolErrors = true; // В этом случае блок catch не будет выходить по ошибке.
string _request = null;
try
{
// Создадим цикл из пяти запросов.
for (int i = 1; i <= 5; i++)
{
var responce = request.Get("https://zennolab.com");
if (responce.StatusCode == HttpStatusCode.OK)
{
// HTTP status 200 - выходим из цикла, запрос вернул ответ
_request = responce.ToString();
break;
}
else if (responce.StatusCode == HttpStatusCode.NotFound)
{
// HTTP status 404
throw new Exception("Сервер вернул 404 - Страница не найдена");
}
if (responce.StatusCode == HttpStatusCode.InternalServerError)
{
// HTTP status 500
project.SendErrorToLog("Сервер вернул 500 - Сервер приболел, сделаем паузу", true);
Thread.Sleep(2000);
}
else if (Responce.Address.AbsolutePath.Contains("/errors/500.html"))
{
// Можем проверять абсолютный путь конечной ссылки
project.SendErrorToLog("Сервер вернул 500 - Сервер приболел, сделаем паузу", true);
Thread.Sleep(2000);
}
else if (Responce.Address.Host.Contains("zennostore"))
{
// Можем проверять адрес хоста на случай переадресации.
throw new Exception("Сервер перекинул на хост zennostore");
}
}
}
// С Подробной информацией по статус кодам можно ознакомитсья по ссылке:
// https://docs.microsoft.com/en-us/dotnet/api/system.net.httpstatuscode?redirectedfrom=MSDN&view=net-5.0
///++++++++++++++++++++++++++++++++++++++++++
/// Настройки для запроса
///++++++++++++++++++++++++++++++++++++++++++
C#:
HttpRequest request = null;
request.Cookies = new CookieStorage();
request.UserAgent = Http.ChromeUserAgent(); // Создает UserAgent
/// UserAgents were updated in January 2019.
// ChromeUserAgent()
// FirefoxUserAgent()
// IEUserAgent()
// OperaUserAgent()
// OperaMiniUserAgent()
request.IgnoreProtocolErrors = true; // Блок catch не будет выходить по ошибке если 4xx или 5xx.
request.EnableEncodingContent = true;
request.KeepAlive = true;
request.AllowAutoRedirect = true;
request.MaximumAutomaticRedirections = 5;
request.ReconnectLimit = 3;
request.ReconnectDelay = 50;
request[HttpHeader.DNT] = "1";
request[HttpHeader.UpgradeInsecureRequests] = "1";
request["Host"] = String.Format("www.{0}", "zennolab.com");
request[HttpHeader.Accept] = "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8";
request[HttpHeader.AcceptLanguage] = "en-US,en;q=0.5";
request.AcceptEncoding = "gzip, deflate, br";
///++++++++++++++++++++++++++++++++++++++++++
/// Работа с GET запросами:
///++++++++++++++++++++++++++++++++++++++++++
C#:
// Если не нужен ответ
request.Get("https://zennolab.com").None();
// Можем сделать запрос без возврата значения
request.Get("https://zennolab.com");
// Либо объявить var и работать с ним.
var httpResponse = request.Get("https://zennolab.com").ToString();
string html = httpResponse.ToString();
string headerToken = httpResponse["cf-request-id"];
// Скачиваем файл.
var resp = request.Get("http://google.com/file.zip");
resp.ToFile("C:\\myDownloadedFile.zip");
///++++++++++++++++++++++++++++++++++++++++++
/// Работа с POST запросами:
///++++++++++++++++++++++++++++++++++++++++++
C#:
// Если ответ не нужен
request.Post("https://zennolab.com").None();
// Запрос без возврата значения в переменную
request.Post("https://zennolab.com");
// Объявляем var и работаем с ним.
var httpResponse = request.Post("https://zennolab.com");
string html = httpResponse.ToString();
//++++++++++++++++++++++++++++++++++++++++++
// Отправка запроса с параметрами
C#:
var httpResponse = request.Post("https://zennolab.com", new StringContent("referrer=&queryString="));
// Либо объявить StringContent предварительно
var stringContent = new StringContent("referrer=&queryString=");
var httpResponse = request.Post("https://zennolab.com", stringContent);
//++++++++++++++++++++++++++++++++++++++++++
// Отправка мультипарт запроса
C#:
var multipartContent = new MultipartContent()
{
{new StringContent("Harry Potter"), "login"},
{new StringContent("Crucio"), "password"},
{new FileContent(@"C:\hp.rar"), "file1", "hp.rar"}
};
var httpResponse = request.Post("https://zennolab.com", multipartContent);
//++++++++++++++++++++++++++++++++++++++++++
// Отправка JSON в запросе
C#:
var stringContent = new StringContent("{\"login\":\"shelest@gmail.com\",\"password\":\"admin123\"}");
var httpResponse = request.Post("https://zennolab.com", stringContent, "application/json");
//++++++++++++++++++++++++++++++++++++++++++
// RequestParams
C#:
var urlParams = new RequestParams
{
{ ["id"] = "zY6vR6hU8kG0wE7u" },
{ ["имя"] = "Игорь" },
{ ["jsonContent"] = "{\"login\":\"shelest@gmail.com\",\"password\":\"admin123\"}" }
}
var httpResponse = request.Post("https://zennolab.com", urlParams);
// Либо через объявление
var urlParams = new RequestParams();
urlParams["id"] = "zY6vR6hU8kG0wE7u";
urlParams["имя"] = "Игорь";
urlParams["jsonContent"] = "{\"login\":\"shelest@gmail.com\",\"password\":\"admin123\"}";
var httpResponse = request.Post("https://zennolab.com", urlParams);
///++++++++++++++++++++++++++++++++++++++++++
/// Работа с Cookie
///++++++++++++++++++++++++++++++++++++++++++
Для работы с куки необходимо объявить CookieStorage.
C#:
HttpRequest request = new HttpRequest();
request.Cookies = new CookieStorage();
C#:
// Получение нужной куки
HttpRequest request = new HttpRequest();
request.Cookies = new CookieStorage();
string xf_session = null;
using (request)
{
request.Get("https://zennolab.com");
var cookies = request.Cookies.GetCookies("https://zennolab.com");
foreach (Cookie cookie in cookies)
{
// Перебор всех кук в лог
project.SendInfoToLog(String.Format("Name: {0} ::: Value: {1}", cookie.Name, cookie.Value), true);
// Получаем в переменную куку xf_session
if (cookie.Name == "xf_session") xf_session = cookie.Value;
}
}
// Добавление новой или обновление существующей куки
// request.Cookies.Set(string name, string value, string domain, string path = "/");
request.Cookies.Set("pll_language", "en", "zennolab.com", "/");
//++++++++++++++++++++++++++++++++++++++++++
// Сохранение и загрузка кук
C#:
//++++++++++++++++++++++++++++++++++++++++++
// Сохранение в файл
HttpRequest request = new HttpRequest();
// Объявляем новый контейнер, который сохраним в файл.
request.Cookies = new CookieStorage();
// Сохранение CookieStorage в файл .jar
request.Cookies.SaveToFile("D:\\cookie.jar", true);
C#:
//++++++++++++++++++++++++++++++++++++++++++
// Загрузка из файла
HttpRequest request = new HttpRequest();
// Объявлять новый CookieStorage не нужно.
request.Cookies = CookieStorage.LoadFromFile("D:\\cookie.jar");
C#:
//++++++++++++++++++++++++++++++++++++++++++
// Сохранение в массив байт
HttpRequest request = new HttpRequest();
request.Cookies = new CookieStorage();
// Сохранение CookieStorage в массив байт - byte[]
var byteArray = request.Cookies.ToBytes();
// Преобразовываем массив байт в строку - string.
string base64 = Convert.ToBase64String(byteArray);
C#:
//++++++++++++++++++++++++++++++++++++++++++
// Загрузка из массива байт
string base64 = "";
HttpRequest request = new HttpRequest();
// Преобразование строки base64 в массив байт
byte[] decByte = Convert.FromBase64String(base64);
// Загрузка CookieStorage массива байт - byte[].
request.Cookies = CookieStorage.FromBytes(decByte);
//++++++++++++++++++++++++++++++++++++++++++
// Работа с Proxy
//++++++++++++++++++++++++++++++++++++++++++
Задавать проекту прокси можно разными способами, выбирайте удобный в вашем случае.
Библиотека поддерживает работу со следующими протоколами:
- HTTP
- Socks4
- Socks4A
- Socks5
C#:
// Вариант 1
request.Proxy = ProxyClient.Parse(ProxyType.HTTP, "ip:port:username:password");
// Вариант 2
request.Proxy = new HttpProxyClient("127.0.0.1", 8888, "username", "password");
request.Proxy = new Socks4ProxyClient("127.0.0.1", 8888, "username", "password");
request.Proxy = new Socks4aProxyClient("127.0.0.1", 8888, "username", "password");
request.Proxy = new Socks5ProxyClient("127.0.0.1", 8888, "username", "password");
// Вариант 3, в случае, когда авторизацию можно задать позже
request.Proxy = HttpProxyClient.Parse("127.0.0.1:8888");
request.Proxy.Username = "username";
request.Proxy.Password = "password";
- Номер конкурса статей
- Четырнадцатый конкурс статей
- Тема статьи
- Нестандартные хаки
Вложения
Последнее редактирование:




Все собирался перейти с xNet на leaf.xnet да лень самому было копаться и искать информацию 

. Жарю на Xnet, всё хочу уйти с нее на Leaf.xNet, да никак всё не могу собраться с силами да разобраться в чем там отличия. А тут опа и мануальчик вводный. На досуге ознакомлюсь. Заранее спасибо.