Что такое сервер api. Грамотная клиент-серверная архитектура: как правильно проектировать и разрабатывать web API
6.1 Метод CheckDimensions
Синтаксис:
Boolean CheckDimenshions (Dimensions DimensionsList,
Out float Length,
Out float Width,
Out float Height,
Out float Weight,
Out string Comment)
Параметры:
Имя параметра | Входной / Выходной | Тип | Описание |
---|---|---|---|
DimensionsList | входной | Dimensions | Массив габаритновесовых характеристик товаров |
Length | выходной | float | Длина посылки |
Width | выходной | float | Ширина посылки |
Height | выходной | float | Высота посылки |
Weight | выходной | float | Вес посылки |
Comment | выходной | float | Текстовое описание при превышении предельных значений габаритновесовых характеристик |
Описание:
В метод передается список габаритновесовых характеристик всех товаров
(DimensionsList). После расчета выходные параметры Length, Width, Height (длина,
ширина и высота соответственно) заполняются габаритами посылки, после решения
задачи «оптимальной укладки», а в параметр Weight передается суммарный вес всех
товаров, без учета упаковочных материалов. В том случае если габариты отправления
превышают предельные значения в параметр Comment передается текстовое описание
несоответствия.
Возвращаемое значение:
Метод возвращает булево значение True, если
габаритновесовые характеристики не превышают предельных значений и доставка
возможна хотя бы одним доступным способом, иначе False. Предположительно данный
метод может использоваться на стороне клиента для оперативной оценки
принципиальной возможности отправки заказа и своевременного принятия какихлибо
решений, если сделать этого невозможно.
6.1.1 Пример вызова метода CheckDimensions
// Предположим, что в корзине 2 позиции и необходимо проверить не превышают ли он
ограничения по допустимым габаритам и весу
aplix.Dimensions Dimensions = new aplix.Dimensions;
aplix.Dimensions Item;
Item.Length = 0.130f;
Item.Width = 0.100f;
Item.Height = 0.001f;
Item.Weight = 0.1f;
Item.Qty = 2;
Dimensions = Item;
Item = new aplix.Dimensions();
Item.Length = 0.1331f;
Item.Width = 0.0998f;
Item.Height = 0.0788f;
Item.Weight = 0.575f;
Item.Qty = 1;
Dimensions = Item;
// Выходные параметры
float Length;
float Width;
float Height;
float Weight;
string Comment;
// Выполнить проверку габаритно‐весовых характеристик
bool Result = ws.CheckDimenshions(Dimensions, out Length, out Width, out Height, outWeight, out Comment);
// Визуализация результата
Response.Write("Result:" + Result.ToString() + "");
Response.Write("Length:" + Length.ToString() + "");
Response.Write("Width:" + Width.ToString() + "");
Response.Write("Height:" + Height.ToString() + "");
Response.Write("Weight:" + Weight.ToString() + "");
Response.Write("Weight:" + Comment + "");
6.2 Метод CalculateShippingCost
Синтаксис:
Long CalculateShippingCost
(string OrderNumber,
Float DeclaredCost,
Goods Goods,
Address Address,
Byte TypeOfSeal,
Boolean SturdyPackaging,
Boolean CashOnDelivery,
Out DeliveryType Types,
Out string Comments)Параметры:
Имя параметра | Входной / Выходной | Тип | Описание |
---|---|---|---|
OrderNumber | входной | string | Номер заказа, если известен в системе потребителя. Если будет задан, то расчет в будущем будет привязан к заказу. |
DeclaredCost | входной | Float | Объявленная ценность отправления. На страховка. |
Goods | входной | Goods | Список товаров массив структур (Артикул, Наименование, Длина, Ширина, Высота, Вес, Количество) |
Address | входной | Address | Адрес получателя (структура: Почтовый индекс, Регион, Район, Город, Населенный пункт, Улица, Дом, Корпус, Картира) |
TypeOfSeal | входной | Byte | Вариант уплотнения, возможные значения:1 Не требуется 2 Пузырчатая пленка 3 Наполнитель |
SturdyPackagin | входной | Boolean | Обязательно ли требуется жесткая упаковка |
CashOnDelivery | входной | Boolean | Требуется ли наложенный платеж |
Types | выходной | DeliveryType | |
Comments | выходной | DeliveryType | Список доступных вариантов доставки |
Описание:
Метод по заданным параметрам выдает список доступных вариантов доставки
(выходной параметр Types) в виде массива структур <Идентификатор способа доставки, Наименование способа доставки, Себестоимость доставки, Страховую премию, Затраты на упаковку и маркировку, Адрес нахождения почтового отделения, либо точки самовывоза, Режим работы почтового отделения, либо точки самовывоза, Минимальное количество дней доставки, Максимальное количество дней доставки, Доп.информация>. Если в процессе расчета возникли какиелибо исключения, то
описание ошибки будет возвращено в параметр Comments.
Возвращаемое значение:
Метод возвращает уникальный идентификатор расчета, по которому в дальнейшем
можно будет запросить детализацию материальных и трудовых затрат, используя метод
GetDetailsOfCost.
6.2.1 Пример вызова метода CalculateShippingCost
ws.Credentials = new NetworkCredential("test", "test");
Address.Index = "684005";
Address.City = "Елизово г";
Address.Home = "16";
aplix.Goods Item;
Item = new aplix.Goods();
Item.SKU = "216293";
Item.Length = 0.130f;
Item.Width = 0.100f;
Item.Height = 0.001f;
Item.Weight = 0.1f;
Item.Qty = 2;
Goods = Item;
Item = new aplix.Goods();
Item.SKU = "499687";
Item.Length = 0.1331f;
Item.Width = 0.0998f;
Item.Height = 0.0788f;
Item.Weight = 0.575f;
Item.Qty = 1;
Goods = Item;
//Заполним параметры для калькулятора
string OrderNumber="1234567890";
float DeclaredCost = 36370;
sbyte TypeOfSeal = 1;
bool SturdyPackaging = true;
bool CashOnDelivery = false;
aplix.DeliveryType Types; string Comments;
//Вызов калькулятора
long Status = ws.CalculateShippingCost(OrderNumber, DeclaredCost, Goods, Address,TypeOfSeal, SturdyPackaging,CashOnDelivery, out Types, out Comments);
//Визуализация результата
Response.Write("Id расчета:"+Status.ToString()+"
");
Response.Write("Доп.информация по расчету:" + Comments + "
");
Response.Write(@"
");
foreach (aplix.DeliveryType type in Types) {
Response.Write(""+ " "+ " "+ " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " "); }
Response.Write("
TypeId | TypeName | TypeDescription | Cost | Insurance | PostalRate | PreparingCost | Address | Worktime | MinPeriod | MaxPeriod | AdditionalInformation |
---|---|---|---|---|---|---|---|---|---|---|---|
" + type.TypeId.ToString() + " | " + type.TypeName + " | " + type.TypeDescription + " | " + type.Cost.ToString() + " | " + type.Insurance.ToString() + " | " + type.PostalRate.ToString() + " | " + type.PreparingCost.ToString() + " | " + type.Address + " | " + type.Worktime + " | " + type.MinPeriod.ToString() + " | " + type.MaxPeriod.ToString() + " | " + type.AdditionalInformation + " |
");
}
6.3 Метод PushOrder
Синтаксис:
Long PushOrder (
ID,
Number,
Date,
Customer,
DeclaredCost,
AmountToBePaid,
DeliveryTypeId,
TypeOfSeal,
SturdyPackaging,
Activity,
Goods,
DeliveryDate,
StartTimeDelivery,
EndTimeDelivery,
Сomment,
ShipperId,
Marker)
Параметры:
Имя параметра | Входной / Выходной | Тип | Описание |
---|---|---|---|
ID | входной | String |
Идентификатор заказа в системе потребителя (уникальное значение) |
Number | входной | String |
Номер заказа в системе потребителя (будет распечатываться в комментариях при маркировке отправлений) |
Date | входной | DateTime |
Дата заказа в системе потребителя (будет распечатываться в комментариях при маркировке отправлений |
Customer | входной | Customer |
Информация о покупателя, струкутра |
DeclaredCost | входной | Float |
Объявленная ценность отправления. На указанную сумму будет оформленная страховка. |
AmountToBeP aid |
входной | Float |
Сумма к оплате. Если заказ предоплаченю то 0. |
DeliveryTypeId | входной | Int |
Идентификатор выбранного способа доставки. |
TypeOfSeal | входной | Int |
Вариант уплотнения, возможные значения: 1Не требуется 2Пузырчатая пленка 3Наполнитель |
SturdyPackaging | входной | Boolean |
Обязательно ли требуется жесткая упаковка |
Activity | входной | Boolean |
Актуальность заказа. True – если заказ актуален, False – если заказ отменен. |
Goods | входной | Goods | Список товаров |
DeliveryDate | входной | DateTime |
Дата доставки, заполняется если выбрана курьерская доставка |
StartTimeDeliv ery |
входной | Int |
Желаемое время доставки «С», доставка |
EndTimeDelivery | входной | Int |
Желаемое время доставки «До», заполняется если выбрана курьерская доставка |
Сomment | входной | String | Комментарий к заказу |
ShipperId | входной | String |
Идентификатор отправителя, заполняется если у контрагента несколько интернет магазинов |
Marker | входной | String |
Маркер заказа, заполняется если отправления маркируются метками сайт |
Описание:
Метод размещает информацию о заказе в системе исполнителя. Системапотребитель
передает номер и дату заказа, уникальный идентификатор заказа, информацию о
получателе, включая его адрес и телефон, объявленную ценность, сумму наложенного
платежа если таковая есть, состав товарного вложения, тип упаковки и выбранный
способ и детали доставки.
Возвращаемое значение:
Метод возвращает уникальный идентификатор заказа в системе исполнителя.
6.3.1 Пример вызова метода PushOrder
aplix.Delivery ws = new aplix.Delivery();
ws.Credentials = new NetworkCredential("test", "test");
// Подготовим струкутру "Получатель отправления"
aplix.Customer Customer = new aplix.Customer();
// 684005, Камчатский край, Елизовский р‐н, Елизово г, Ленинская ул, дом No 16
aplix.Address Address = new aplix.Address();
Address.Index = "684005";
Address.Region = "Камчатский край";
Address.District = "Елизовский р‐н";
Address.City = "Елизово г";
Address.Street = "Ленинская ул";
Address.Home = "16";
Customer.Address = Address;
Customer.ID = "[email protected]";
Customer.Name = "Сергей";
Customer.Email = "[email protected]";
Customer.Phone = "+7(916)975‐53‐54";
//Заполним параметры заказа
string ID = "2013‐1234567890"; // Уникальный идентификатор заказа в системе клиента
string Number = "1234567890"; // Номер заказа в системе клиента
DateTime Date = new DateTime(2013, 08, 30);
float DeclaredCost = 36350.0f; // Объявленная ценность
float AmountToBePaid = 0; // Нет наложенного платежа
int DeliveryTypeId = 4; // ЕМС
sbyte TypeOfSeal = 2; // Пузырчатая пленка
bool SturdyPackaging = true; // Жесткая упаковка (для хрупких вещей)
bool Activity = true; // Документ актуален
// Предположим, что заказ состоит из 2 позиций
aplix.Goods Goods = new aplix.Goods;
aplix.Goods Item;
Item = new aplix.Goods();
Item.SKU = "216293";
Item.Name = "карта памяти SDXC 64Gb Class 10 Transcend";
Item.Length = 0.130f;
Item.Width = 0.100f;
Item.Height = 0.001f;
Item.Weight = 0.1f;
Item.Qty = 1;
Item.Price = 2080.0f;
Item.VATRate = "НДС18";
Goods = Item;
Item = new aplix.Goods();
Item.SKU = "499687";
Item.Name = "зеркальный фотоаппарат Canon EOS 650D Kit Tamron AF 18‐270mm Black";
Item.Length = 0.1331f;
Item.Width = 0.0998f;
Item.Height = 0.0788f;
Item.Weight = 0.575f;
Item.Qty = 1;
Item.Price = 34270.0f;
Item.VATRate = "НДС18";
Goods = Item;
DateTime DeliveryDate = new DateTime(2013, 09, 05); //Доставка на 05 09 2013 года
int StartTimeDelivery = 10; // интервал доставки с 10
int EndTimeDelivery = 14; // до 14
string Comment = "Тестовый заказ";
//Впулить заказ в систему
long OrderId = ws.PushOrder(ID, Number, Date, Customer, DeclaredCost, AmountToBePaid,DeliveryTypeId, TypeOfSeal, SturdyPackaging, Activity, Goods, DeliveryDate, StartTimeDelivery,EndTimeDelivery, Comment, "", "");
Response.Write("Id заказа:" + OrderId.ToString() + "
");
6.4 Метод GetDetailsOfCost
Синтаксис: DetailsOfCostList GetDetailsOfCost (ID, TypeId) Параметры:
Входной / Выходной
Тип
Описание
входной
Long
Идентификатор расчета (уникальное значение), полученный при вызове метода CalculateShippingCost
входной
Int
Имя параметра | |
---|---|
ID | TypeId |
Описание:
Метод возвращает детализированный список затрат на маркировку и упаковку отправления по заданным идентификатору расчета и идентификатору варианта доставки. Возвращаемое значение:
Метод возвращает массив структур
Каждый элемент массива содержит описание затраты, количество, цену и стоимость.
6.4.1 Пример вызова метода GetDetailsOfCost
aplix.Delivery ws = new aplix.Delivery();
ws.Credentials = new NetworkCredential("test", "test");
long ID = 168; // Идентификатор расчета, полученный методом CalculateShippingCost
int TypeId = 3; // Почтовая доставка
aplix.DetailsOfCost Details = ws.GetDetailsOfCost(ID, TypeId);
//Визуализация результата
Response.Write("Id расчета:" + ID.ToString() + "
");
Response.Write("Id метода доставки:" + TypeId.ToString() + "
");
Response.Write(@"
");
foreach (aplix.DetailsOfCost DetailOfCost in Details)
{
Response.Write("" + " " + " " + " " + " " + " ");
}
Response.Write("
Description | Price | Qty | Cost |
---|---|---|---|
" + DetailOfCost.Description + " | " + DetailOfCost.Price.ToString() + " | " + DetailOfCost.Qty.ToString() + " | " + DetailOfCost.Cost.ToString() + " |
");
6.5 Метод PushReestr
Синтаксис: Long PushOrder (ID, Number, Date, DateOfShipment, IDs) Параметры:
Входной / Выходной
Тип
Описаниевходной
String
Идентификатор реестра в системе потребителя (уникальное значение)входной
String
Идентификатор варианта доставки, по которому необходимо получить детализациювходной
DateTime
Дата реестра (будет распечатываться в актах приемапередачи отправлений)входной
DateTime
Ожидаемая дата передачи отправлений исполнителювходной
String
Массив идентификаторов заказов, которые включаются в данный реестр
Имя параметра | ||||
---|---|---|---|---|
ID | Number | Date | DateOfShipment | IDs |
Описание: Метод размещает информацию о реестре в системе исполнителя. Системапотребитель передает номер и дату реестра, уникальный идентификатор реестра, ожидаемую дату передачи отправлений исполнителю. Возвращаемое значение: Метод возвращает уникальный идентификатор реестра в системе исполнителя.
6.5.1 Пример вызова метода PushReestr
aplix.Delivery ws = new aplix.Delivery();
ws.Credentials = new NetworkCredential("test", "test");
// Список идентификаторов заказов, которые входят в данный реестр
string IDs={"2013‐1234567890", "2013‐1234567891"};
// Уникальный идентификатор реестра в системе клиента
string ID = "2013‐r12345";
// Номер реестра в системе клиента
string Number = "r12345";
// Дата формирования реестра в системе клиента
DateTime Date = new DateTime(2013, 10, 22);
// Предполагаемая дата передачи заказов на доставку
DateTime DateOfShipment = new DateTime(2013, 10, 23);
// Получим детализацию расчета
long ReestID = ws.PushReestr(ID, Number, Date, DateOfShipment, IDs);
//Визуализация результата
Response.Write("Id реестра:" + ReestID.ToString() + "
");
6.6 Метод GetTrackNumbers
Синтаксис: DateTime GetTrackNumbers (DateOfLastGetting, TrackNumbers) Параметры:
Входной / Выходной
Тип
Описание
входной
DateTime
Дата последнего успешного получения трекномеров. Параметр используется для того чтобы сократить объем передаваемых данных и не дублировать данные, которые были выгружены ранее.
входной
TrackNumber
Массив трекномеров по заказам
Имя параметра | |
---|---|
DateOfLastGetting | TrackNumbers |
Описание: Метод возвращает список трекномеров, которые были привязаны к заказам за период с DateOfLastGetting по текущее время. Результата помещается в выходной параметр TrackNumbers. Свойство Activity имеет значение true, если трекномер актуален, иначе ложь. Возможны ситуации, когда отправлению присваивается один трекномер, а по истечении некоторого второй трек номер, в этом случае трекномер, присвоенный изначально становиться не актуальным. Возвращаемое значение: Метод возвращает дату и время на которое актуальны выгружаемые данные. Данное значение необходимо использовать при следующем вызове метода GetTrackNumbers в параметре DateOfLastGetting.
6.6.1 Пример вызова метода GetTrackNumbers
aplix.Delivery ws = new aplix.Delivery();
ws.Credentials = new NetworkCredential("test", "test");
// Дата последнего удачного получения треков
DateTime DateOfLastGetting = new DateTime(2013, 08, 01);
aplix.TrackNumber TrackNumbers;
// Получим список трек‐номеров
DateTime NewDateOfLastGetting = ws.GetTrackNumbers(DateOfLastGetting, out TrackNumbers);
//Визуализация результата
Response.Write("NewDateOfLastGetting: " + NewDateOfLastGetting.ToString() +"
");
Response.Write(@"
");
foreach (aplix.TrackNumber TrackNumber in TrackNumbers)
{
Response.Write("" + " " + " " + " " + " ");
}
Response.Write("
OrderID | TrackNumber | Activity |
---|---|---|
" + TrackNumber.OrderID.ToString() + " | " + TrackNumber.Number + " | " + TrackNumber.Activity+ " |
");
API (Application Programming Interface) — это определенное представление данных для взаимодействия между приложениями. В частном случае, в качестве ответного приложения, может выступать сервер. АПИ — это описанный формат, которому должны соответствовать обе стороны обмена данными.
Технология различных API — это набор методов взаимодействия. Система АПИ в том или ином виде представлена везде. Например, у нас в руках смартфон с приложением покупки билетов. На самом «высоком» уровне мы видим графическую часть приложения с полями ввода данных. Мы запрашиваем рейсы по маршруту на определенный день и что в этот момент происходит:
- Мобильное приложение формирует запрос к серверу. Запрос формируется в определенном формате. Например: Вылет:МоскваDME,Прилет:АмстердамAMS,Дата:01-01-2017,Мест:2,Класс:Эконом. Эта строчка содержит строгий формат — Заголовок:Значение, все значения через запятую, обязательные поля Вылет, Прилет и Дата, если не указаны другие данные, то они будут по-умолчанию: Мест:1, Класс:Эконом.
- Сервер авиакомпании получает этот запрос и программа понимает, что от нее требуется найти рейсы и цены.
- Сервер обращается к базе данных на языке SQL, что тоже является частным представлением API
- База данных обращается к файлу через API файловой системы
- Файловая система обращается к жесткому диску — через его API-протокол.
Можно продолжить углубление, но и так понятно, что любая задача программирования — это выстраивание иерархии API.
Сегодня в том или ином виде, вся информация в компьютерном виде представляется посредством АПИ.
Мы разрабатываем системы API для высшего уровня, где следующим потребителем является клиентское приложение.
Классификация видов АПИ
В зависимости от решаемой задачи, протоколы передачи АПИ могут быть как стандартизированные, так и собственного формата. Наиболее часто применяются стандартизированные протоколы, это позволяет разработчикам задействовать готовые модули для их обработки, что сокращает время на разработку приложения. Различные специфические типы применяются для достижения определенного преимущества, например снижения трафика, скорость распознавания команд, а в некоторых случаях — это единственная возможность — разработка собственного формата — к примеру вещание видео с эфимеридной составляющей.
По виду передаваемой информации АПИ подразделяется на следующие форматы:
- Стандартные протоколы API
- Текстовый
- Бинарный
- Поточный
- Кадровый
По виду взаимодействия клиент-сервер, наиболее распространены следующие виды:
- Пакетные
- HTTP/HTTPS
- Sockets
- Процедурные (протокольные)
- Поточные
- Широковещательные
Применение систем АПИ
Все онлайн-сервисы и системы имеют публичные API. В некоторых случаях за использование доступа к API приходится оплатить подписку или определенное количество обращений. Если в Ваших целях стоит создание онлайн-сервиса, который будет предоставлять какую-либо информацию, обратите на API особенное внимание. Подход и хорошее документирование возможностей API, это ключ к успеху. Все сторонние разработчики, которые в последующем будут создавать дополнительные приложения, обязаны использовать именно этот протокол.
Довольно частая практика, когда сервер API, это единственное представление данных всего сервиса, а клиентская часть работает только через приложение. Яркие примеры Viber, Instagram, Swarm- еще эти приложения называют Mobile only (только в мобильном). В связи с этим, должна быть создана система распределения нагрузки между серверами API, что позволит создать сервис 24/7 при масштабируемой мощности. Перед созданием серверной части, следует сразу оценить возможности данного мероприятия и учитывать эти возможности при разработке программ.
Для достижения стабильности, преимущественно применяются разработки под Linux-среду и его системные сервисы. Это обуславливается тем, что эта операционная система более гибкая, ресурсоемкая и имеет высокий уровень журналирования и отладки при сбоях. В качестве публикатора применяются веб-серверы или специальные сервисы. Мы имеем ряд наработок многопоточных сервисов для обеспечения систем API.
Мы описали, как это работает, давайте взглянем, как на этом зарабатывать? Первый метод напрашивается сам собой — предоставление услуги через АПИ. Вы можете продавать услуги или товары напрямую — обращение к АПИ Вашего ресторана, сформирует заказ на доставку еды на дом. Или предоставлять полезный сервис на платной основе, например формирование бухгалтерских отчетов.
Второй метод заработка на АПИ заключается в аггрегировании нескольких систем в один сервис. Мы уже обсудили вид АПИ для авиакомпании, но авиакомпаний десятки, а то и сотни. Сейчас стали популярны сервисы по продаже билетов — Aviasales, OneTwoTrip, Momondo, которые фактически из себя ничего не представляют, а только берут разные АПИ от авиакомпаний и публикуют собственный сервис, который собирает данные с этих компаний. Практика очень распространенная и высокодоходная.
Третий метод заработка на API, это «подмешивание данных». Если опять вернемся к авиакомпании, то мы можем создать сопутствующую услугу на их базе, к примеру, страхование. Мы публикуем сервис или альтернативную точку входа АПИ, где помимо рейсов, в данные АПИ будет добавлена информация по страхованию с привязкой к конкретному рейсу. Также поступают, к примеру, авиакомпании или посредники, расширяя АПИ для информирования об отелях.
Создание технологий АПИ
Мы предлагаем свои услуги по созданию серверов API всех описанных ранее типов и протоколов. Мы имеем опыт построения взаимодействия в различных высоконагруженных системах. На выходе мы представляем не только готовый сервер (черный ящик) но и полное описание протокола в виде конструкторской документации. Данное описание протокола может быть предоставлено следующим разработчикам, применяемым эти данные, либо в открытом доступе для OpenSource.
Помимо непосредственно сервера, мы можем создать систему слежения и аналитики, которая будет сигнализировать об ошибках и превышением регламентированной нагрузки сервера(-ов).
API (от англ. Application Program Interface) – это интерфейс взаимодействия между сайтом клиента и сервером. Представляет собой ресурс, который сервер открывает для работы извне, т.е. программист может воспользоваться им для получения доступа к функционалу программы, библиотеки, модуля. API делает возможным работу ресурсов, которые используют потенциал и мощность предоставляющего сайта, а также запуск дополнительных компонентов к ним, расширяющих возможности web-проекта.
Преимущества:
Типы
- возвращающие. На запрос стороннего приложения какого-либо метода с заданными параметрами сервер дает запрашиваемую информацию в определенном формате;
- изменяющие. Клиент вызывает некоторую функцию сервера, которая вводит новую информацию или изменяет на нем определенные настройки.
API Яндекс.Директа
Для продвижения сайтов эффективен API .
- На его базе разработчики могут создавать приложения, которые напрямую взаимодействуют со службой поисковой системы. Такие программы позволят рекламодателям гибко управлять масштабными , получать статистические отчеты по каждой из них, точно прогнозировать бюджеты.
- Рекламные агентства с помощью API Директа могут просмотреть весь список своих клиентов, клиенты – представителей.
- Если определенные фразы, используемые для поисковой оптимизации , дают низкий CTR в контекстной рекламе, показ по ним можно автоматически отключить. На тематических площадках через API можно задавать ставки, определенные доноры могут быть удалены.
- API Яндекс.Директа имеет SOAP-интерфейс, т.е предоставляет широкий выбор языков программирования для создания приложений. Данный протокол поддерживается такими языками, как Perl, Java,