Сознатик
Обмен данными с Битрикс24 REST API из .NET C#

Обмен данными с Битрикс24 REST API из .NET C#

17.05.2017 | 10665

272 193 Подписаться

Сегодня я расскажу как создать свою программу на C# .NET для работы с Битрикс24 REST API.

Для проекта выбрал последнюю на сегодняшний день Visual Studio Community 2017, создал консольное Windows приложение.

Для начала Вам нужно добавить свое приложение в Битрикс24, для этого зайдите ваш портал xxx.bitrix24.ru.

Раздел Мои приложения в Битрикс24

Выберите слева в меню пункт "Приложения", далее "Мои приложения", далее "Добавить приложение".

Указываем название приложения и права

Укажите название Вашего приложения, можно указать любое какое угодно. Установите флаг "Приложение использует только API". Укажите права доступа, это те разделы Битрикс24 с которыми Вы сможете работать из вашей программы через REST API.

Указываем ссылку на свой сайт

Укажите ссылку на ваш сайт, если сайта нет, то укажите любой сайт, например soznatik.ru )) Другие поля не заполняйте, нажимайте кнопку "Сохранить".

Всё! Теперь в разделе "Мои приложения" Вы сможете увидеть своё только что добавленное приложение. Скопируйте от туда "Код приложения (client_id)" и "Ключ приложения (client_secret)".

Далее начинаем создавать консольное приложение в Visual Studio.

Создаем консольное приложение в Visual Studio

Меню Файл - Создать - Проект. Называем проект к примеру "TestAPI_BX".

Вставляем следующий код:

using Newtonsoft.Json;

using Newtonsoft.Json.Converters;

using System;

using System.Dynamic;

using System.IO;

using System.Net;

using System.Text;

namespace TestAPI_BX

{

//Создаем класс для работы с Битрикс24 из C#

class Bitrix24

{

//Объявляем константы

private const string BX_ClientID = "local.58f736938000000000000"; //Ваш Код приложения (client_id)

private const string BX_ClientSecret = "N9NjwzOeh6jhgkhkjhjkhkjk6ZdrzcC4f2"; //Ваш Ключ приложения (client_secret)

private const string BX_Portal = "https://xxxx.bitrix24.ru"; //Адрес вашего портала\сайта в Битрикс24

private const string BX_OAuthSite = "https://oauth.bitrix.info"; //Этот адрес не изменяйте

//Объявляем приватные служебные поля

private string AccessToken;

private string RefreshToken;

private DateTime RefreshTime;

private string Code;

private string Cookie;

//Создаем конструктор с вызовом подключения к Битрикс24 при создании экземпляра данного класса

public Bitrix24()

{

Connect();

}

//Создаем закрытый метод для начального подключения к Битрикс24

private void Connect()

{

//Создаем HTTP подключение, здесь ничего не меняем

string BX_URI = BX_Portal + "/oauth/authorize/?client_id=" + BX_ClientID;

HttpWebRequest requestLogonBitrix24 = (HttpWebRequest)WebRequest.Create(BX_URI);

//Укажите Ваши логин и пароль пользователя (админа) вашего портала в Битрикс24, под которым будут выполнять REST запросы к Битрикс24.

string username = "mail@mail.ru";

string password = "sdfdFDSfsdf";

//Настраиваем подключение, ничего не меняем

string svcCredentials = Convert.ToBase64String(ASCIIEncoding.ASCII.GetBytes(username + ":" + password));

requestLogonBitrix24.Headers.Add("Authorization", "Basic " + svcCredentials);

requestLogonBitrix24.AllowAutoRedirect = false; // Это обязательное условие, чтобы нас автоматически не переадресовывали на другую страницу

requestLogonBitrix24.Method = "POST";

//Подключаемся (отправляем запрос)

HttpWebResponse responseLogonBitrix24 = (HttpWebResponse)requestLogonBitrix24.GetResponse();

//Проверяем что статус-код доджен быть 302, нам должны предложить переадресацию, иначе авторизация не требуется, мы и так авторизированы

if (responseLogonBitrix24.StatusCode == HttpStatusCode.Found)

{

//Ничего не меняем, здесь получаем из заголовков ответа Куки и параметры адреса переадресации (из поля "Location") парамер Code

Uri locationURI = new Uri(responseLogonBitrix24.Headers["Location"]);

// Ловко парсим URL-адрес с помощью HttpUtility, подключите "System.Web" через пакеты NuGet

var locationParams = System.Web.HttpUtility.ParseQueryString(locationURI.Query);

Cookie = responseLogonBitrix24.Headers["Set-Cookie"];

Code = locationParams["Code"];

//Вызываем исключение, если Код мы не смогли получить, без него далее ни как.

if (String.IsNullOrEmpty(Code))

{

throw new FormatException("CodeNotFound");

}

//Закрываем подключение

responseLogonBitrix24.Close();

//Если код успешно получили, то формируем новый HTTP запрос для получения Токенов авторизации

string BX_OAuth_URI = BX_OAuthSite + "/oauth/token" + "/?" + "grant_type=authorization_code" + "&" +

"client_id=" + BX_ClientID + "&" +

"client_secret=" + BX_ClientSecret + "&" +

"code=" + Code;

SetToken(BX_OAuth_URI);

}

}

//Закрытый метод для получения и записи Токенов авторизации

private void SetToken(string BX_OAuth_URI)

{

//Формируем новый HTTP запрос для получения Токенов авторизации

HttpWebRequest requestLogonBitrixOAuth = (HttpWebRequest)WebRequest.Create(BX_OAuth_URI);

requestLogonBitrixOAuth.Method = "POST";

requestLogonBitrixOAuth.Headers["Cookie"] = Cookie; //Используем Куки полученный в предыдущем запросе авторизации

//Подключаемся (отправляем запрос)

HttpWebResponse responseLogonBitrixOAuth = (HttpWebResponse)requestLogonBitrixOAuth.GetResponse();

//Если в ответ получаем статус-код отличный от 200, то это ошибка, вызываем исключение

if (responseLogonBitrixOAuth.StatusCode != HttpStatusCode.OK)

{

throw new FormatException("ErrorLogonBitrixOAuth");

}

else

{

//Читаем тело ответа

Stream dataStreamLogonBitrixOAuth = responseLogonBitrixOAuth.GetResponseStream();

var readerLogonBitrixOAuth = new StreamReader(dataStreamLogonBitrixOAuth);

string stringLogonBitrixOAuth = readerLogonBitrixOAuth.ReadToEnd();

//Обязательно закрываем подключения и потоки

readerLogonBitrixOAuth.Close();

responseLogonBitrixOAuth.Close();

//Ловко преобразуем тело ответа в формате JSON в .Net объект с помощью Newtonsoft.Json, не забудьте подключить Newtonsoft.Json через NuGet

var converter = new ExpandoObjectConverter();

dynamic objLogonBitrixOAuth = JsonConvert.DeserializeObject<ExpandoObject>(stringLogonBitrixOAuth, converter);

//Записывем Токены авторизации в поля нашего класса из динамического объекта

AccessToken = objLogonBitrixOAuth.access_token;

RefreshToken = objLogonBitrixOAuth.refresh_token;

RefreshTime = DateTime.Now.AddSeconds(objLogonBitrixOAuth.expires_in); //Добавляем к текущей дате количество секунд действия токена, обычно это плюс один час

//Закрываем поток

dataStreamLogonBitrixOAuth.Close();

}

}

//Закрытый метод для обновления Токенов авторизации, если истекло время их действия

private void RefreshTokens()

{

if (RefreshTime == DateTime.MinValue) // Если RefreshTime пустая

{

//Тогда вызываем авторизацию по полной программе

Connect();

return; //Тогда дальше не идём

}

//Проверяем, если истекло время действия Токена авторизации, то обновляем его

if (RefreshTime.AddSeconds(-5) < DateTime.Now)

{

//Формируем новый HTTP запрос для обновления Токена авторизации, здесь Code уже не нужен

string BX_OAuth_URI = BX_OAuthSite + "/oauth/token" + "/?" + "grant_type=refresh_token" + "&" +

"client_id=" + BX_ClientID + "&" +

"client_secret=" + BX_ClientSecret + "&" +

"refresh_token=" + RefreshToken;

SetToken(BX_OAuth_URI);

}

}

//Открытый метод для отправки REST-запросов в Битрикс24

public string SendCommand(string Command, string Params = "", string Body = "")

{

//Проверяем и обновлем Токены авторизации

RefreshTokens();

//Проверяем возможное указание параметров

string BX_REST_URI = "";

if (String.IsNullOrEmpty(Params))

BX_REST_URI = BX_Portal + "/rest/" + Command + "?auth=" + AccessToken;

else

BX_REST_URI = BX_Portal + "/rest/" + Command + "?auth=" + AccessToken + "&" + Params;

//Создаем новое HTTP подключение для отправки REST-запроса в Битрикс24

HttpWebRequest requestBitrixREST = (HttpWebRequest)WebRequest.Create(BX_REST_URI);

requestBitrixREST.Method = "POST";

requestBitrixREST.Headers["Cookie"] = Cookie; //Используем Куки полученный в запросе авторизации

//Готовим тело запроса и вставляем его в тело POST-запроса

byte[] byteArrayBody = Encoding.UTF8.GetBytes(Body);

requestBitrixREST.ContentType = "application/x-www-form-urlencoded";

requestBitrixREST.ContentLength = byteArrayBody.Length;

Stream dataBodyStream = requestBitrixREST.GetRequestStream();

dataBodyStream.Write(byteArrayBody, 0, byteArrayBody.Length);

dataBodyStream.Close();

//Отправляем данные в Битрикс24

HttpWebResponse responseBitrixREST = (HttpWebResponse)requestBitrixREST.GetResponse();

//Читаем тело ответа от Битрикс24

Stream dataStreamBitrixREST = responseBitrixREST.GetResponseStream();

var readerBitrixREST = new StreamReader(dataStreamBitrixREST);

string stringBitrixREST = readerBitrixREST.ReadToEnd();

//Закрываем все подключения и потоки

readerBitrixREST.Close();

dataStreamBitrixREST.Close();

responseBitrixREST.Close();

//Возвращаем строку ответа в формате JSON

return stringBitrixREST;

}

}

class Program

{

static void Main()

{

//Создаем наш класс, при этом срабатывает конструктор, который сразу авторизируется в Битрикс24

Bitrix24 bx_logon = new Bitrix24();

//Отправляет REST-запрос в Битрикс24, например, получаем список всех задач с помощью команды "task.item.list",

//где номер группы равен 44, если нужно без отбора, то укажите просто "ORDER[]=&FILTER[]=&PARAMS[]=&SELECT[]="

//подробнее о всех методах доступных в API Битрикс24 смотрите на официальном сайте https://dev.1c-bitrix.ru/rest_help/

string TaskListByJSON = bx_logon.SendCommand("task.item.list", "ORDER[]=&FILTER[GROUP_ID]=44&PARAMS[]=&SELECT[]=");

//Далее строку ответа в формате JSON TaskListByJSON можете распарсить в .Net объект

//также как мы делали выше, с помощью Newtonsoft.Json

//Всё. Спасибо за внимание! Надеюсь я Вам в чем-то помог!

}

}

}

272 193 Подписаться


КОММЕНТАРИИ

30.05.2019 12:27:16 - Pretendent

Большое спасибо :)

19.01.2020 18:54:17 - Anton

Спасибо!

04.06.2020 12:53:19 - Grigory

Спасибо, очень помогли

14.07.2020 16:17:11 - Victor

Добрый день, на строке HttpWebResponse responseLogonBitrix24 = (HttpWebResponse)requestLogonBitrix24.GetResponse(); выдает исключение The remote server returned an error: (302) Found.. Настройки ключа, пароля, сайта поменял, в чем может быть дело?

27.08.2020 8:14:03 - Developer

Вот просто интересно. Автор сам пытался воспользоваться фильтрацией данных в том виде, в котором описал ?

09.09.2020 23:59:33 - Владимир

Здравствуйте, помогите пожалуйста правильно передать параметры в команду tasks.task.get Хочу достать имя задачи в ID=1. bx_logon.SendCommand("tasks.task.get", "TASKID[]=1&select[TITLE]="); Спасибо.

28.12.2022 21:15:32 - Павел

Огромное спасибо автору за этот код. Обнаружился следующий нюанс: при передаче параметров в Body в формате json необходимо изменить ContentType: requestBitrixREST.ContentType = "application/json";

Ваш комментарий
9 + 9 =