Начиная с версии 5.3, в BPMonline появилась возможность интеграции с другими приложениями через протокол OData (www.odata.org). Это дает возможность стороннему приложению, написанному на любом языке программирования, посылать HTTP-запросы к BPMonline и получать ответы в форматах XML, Atom или JSON .
Подготовка
Для работы с приложением через протокол OData необходимо обращаться к веб-сервису, который обеспечивает эту возможность. Веб-сервис доступен по адресу:
имя сервера> + "/WebApp/0/ServiceModel/EntityDataService.svc/"
Рекомендуется объявить в коде соответствующую константу, например:
private const string serverUri = "https://mysite.com.ua/WebApp/0/ServiceModel/EntityDataService.svc/";
Также, поскольку по умолчанию ответ формируется в формате Atom, для обработки ответа используются следующие константы:
private static readonly XNamespace ds = "http://schemas.microsoft.com/ado/2007/08/dataservices";
private static readonly XNamespace dsmd = "http://schemas.microsoft.com/ado/2007/08/dataservices/metadata";
private static readonly XNamespace atom = "http://www.w3.org/2005/Atom";
Авторизация
Запросы к BPMonline должны быть авторизованы. BPMonline поддерживает basic аутентификацию. Самый простой способ авторизации при этом – передача учетных данных в заголовке запроса.
Например:
var request = (HttpWebRequest)HttpWebRequest.Create(serverUri);
request.Credentials = new NetworkCredential("UserName", "UserPassword");
Каждый запрос к сервису должен содержать эту информацию.
Обратите внимание: имя пользователя и пароль передаются в открытом виде.
Указанный способ авторизации рекомендуется только в случае использования SSL шифрования (https).
Получение списка записей
Для получения набора записей используется HTTP метод GET. Записи возвращаются постранично, по 40 записей на страницу. Если предполагается, что запрос вернет больше 40 записей, необходимо обеспечить получение следующей страницы по достижении конца текущей.
Например:
string requestUri = serverUri + "ContactCollection?$select=Id,Name";
while (!string.IsNullOrEmpty(requestUri)) {
var request = HttpWebRequest.Create(requestUri) as HttpWebRequest;
request.Method = "GET";
request.Credentials = new NetworkCredential("UserName", "UserPassword");
using (var responce = request.GetResponse()) {
XDocument xmlDoc = XDocument.Load(responce.GetResponseStream());
var entries = from entry in xmlDoc.Descendants(atom + "entry")
select new {
Id = new Guid(entry.Element(atom + "content").Element(dsmd + "properties")
.Element(ds + "Id").Value),
Name = entry.Element(atom + "content").Element(dsmd + "properties")
.Element(ds + "Name").Value
};
requestUri = (from link in xmlDoc.Descendants(atom + "link")
where link.FirstAttribute.Value == "next"
select link.FirstAttribute.NextAttribute.Value).FirstOrDefault();
foreach (var contact in entries) {
//выполнение операций с контактом
}
}
}
В противном случае можно опустить получение ссылки на следующую порцию данных.
Если же необходимо одним запросом получить более чем 40 записей, требуемое количество записей можно указать при помощи параметра $top.
Например:
string requestUri = serverUri + "ContactCollection?$select=Id,Name&$top=60";
Создание записи
Для создания записи используется HTTP метод POST. Необходимо сформировать тело запроса согласно формату XML, Atom или JSON таким образом, чтобы он содержал все необходимые поля записи.
Например:
var content = new XElement(dsmd + "properties",
new XElement(ds + "Name", "John Smith"),
new XElement(ds + "Dear", "Johny"));
var entry = new XElement(atom + "entry",
new XElement(atom + "content",
new XAttribute("type", "application/xml"),
content));
var request =
(HttpWebRequest)HttpWebRequest.Create(serverUri + "ContactCollection/");
request.Credentials = new NetworkCredential("UserName", "UserPassword");
request.Method = "POST";
request.Accept = "application/atom+xml";
request.ContentType = "application/atom+xml;type=entry";
using (var writer = XmlWriter.Create(request.GetRequestStream())) {
entry.WriteTo(writer);
}
using (WebResponse response = request.GetResponse()) {
if (((HttpWebResponse)response).StatusCode == HttpStatusCode.Created) {
// response.Headers["Location"]; ссылка на адрес созданной записи
}
}
Изменение записи
Для изменения записи используется HTTP метод PUT. В запросе указываются новые значения полей, которые нужно изменить.
Например:
string contactId = ""; // Id записи, которую нужно изменить
var content = new XElement(dsmd + "properties",
new XElement(ds + "Name", "Smith")
);
var entry = new XElement(atom + "entry",
new XElement(atom + "content",
new XAttribute("type", "application/xml"),
content)
);
var request = (HttpWebRequest)HttpWebRequest.Create(serverUri
+ "ContactCollection(guid'" + contactId + "')");
request.Credentials = new NetworkCredential("UserName", "UserPassword");
request.Method = "PUT";
request.Accept = "application/atom+xml";
request.ContentType = "application/atom+xml;type=entry";
using (var writer = XmlWriter.Create(request.GetRequestStream())) {
entry.WriteTo(writer);
}
using (WebResponse response = request.GetResponse()) {
}
Удаление записи
Для удаления записи используется HTTP метод DELETE.
Например:
string contactId = ""; // Id записи, которую нужно удалить
var request = (HttpWebRequest)HttpWebRequest.Create(serverUri
+ "ContactCollection(guid'" + contactId + "')");
request.Credentials = new NetworkCredential("UserName", "UserPassword");
request.Method = "DELETE";
using (WebResponse response = request.GetResponse()) {
}