Добрый день.

 

Проконсультируйте пожалуйста, необходимо описание ошибок при создании события с помощью API с просроченным токеном аутентификации, а именно:

 

Какая ошибка возвращается сервером при обращении с просроченным токеном (как BPMCSRF, так и “.ASPXAUTH”)?

Какой HTTP статус будет в ответе сервера?

Какие характерные поля и значение будут в ответном JSON?

Не будет ли наблюдаться множественного редиректа на страницу аутентификации?

 

https://academy.terrasoft.ru/documents/technic-sdk/7-16/autentifikaciya-vneshnih-zaprosov

Нравится

1 комментарий

Евгений, не совсем понял, о каком событии и API речь, но думаю, с любым будет похоже.

Проверить можно, отправив запрос в Fiddler и посмотрев на ответ.

Например, если отправить запрос к OData вовсе без этих кук (с просроченными, видимо, аналогично), то результатом будет 302 и переадресация на страницу логина:

GET https://0901234-se-m-se-demo.bpmonline.com/0/odata/Case?$filter=Status/Id%20eq%207e9f1204-f46b-1410-fb9a-0050ba5d6c38 HTTP/1.1
User-Agent: Fiddler
Host: 0901234-se-m-se-demo.bpmonline.com
 
-----------------------------------------------------------------------------------------------
 
HTTP/1.1 302 Found
Cache-Control: private
Content-Type: text/html; charset=utf-8
Location: /Login/NuiLogin.aspx?ReturnUrl=%2f0%2fodata%2fCase%3f%24filter%3dStatus%2fId%2520eq%25207e9f1204-f46b-1410-fb9a-0050ba5d6c38&$filter=Status/Id%20eq%207e9f1204-f46b-1410-fb9a-0050ba5d6c38
Server: Microsoft-IIS/10.0
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
X-Frame-Options: SAMEORIGIN
X-Content-Type-Options: nosniff
Date: Fri, 17 Jul 2020 12:13:11 GMT
Content-Length: 307
 
<html><head><title>Object moved</title></head><body>
<h2>Object moved to <a href="/Login/NuiLogin.aspx?ReturnUrl=%2f0%2fodata%2fCase%3f%24filter%3dStatus%2fId%2520eq%25207e9f1204-f46b-1410-fb9a-0050ba5d6c38&$filter=Status/Id%20eq%207e9f1204-f46b-1410-fb9a-0050ba5d6c38">here</a>.</h2>
</body></html>
 
-----------------------------------------------------------------------------------------------
 
GET https://0901234-se-m-se-demo.bpmonline.com/Login/NuiLogin.aspx?ReturnUrl=/0/odata/Case?$filter=Status/Id%2520eq%25207e9f1204-f46b-1410-fb9a-0050ba5d6c38&$filter=Status/Id%20eq%207e9f1204-f46b-1410-fb9a-0050ba5d6c38 HTTP/1.1
User-Agent: Fiddler
Host: 0901234-se-m-se-demo.bpmonline.com
 
-----------------------------------------------------------------------------------------------
 
HTTP/1.1 200 OK
Cache-Control: private
Content-Type: text/html; charset=utf-8
Server: Microsoft-IIS/10.0
Set-Cookie: BPMLOADER=n41fokmaq3zbrtakqxthwvec; path=/; secure; HttpOnly
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
X-Frame-Options: SAMEORIGIN
X-Content-Type-Options: nosniff
Date: Fri, 17 Jul 2020 12:13:11 GMT
Content-Length: 6963
 
 
 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 
<html xmlns="http://www.w3.org/1999/xhtml" dir="ltr" culture="en-US">
<head><meta http-equiv="X-UA-Compatible" content="IE=Edge" /><meta name="fontiran.com:license" content="LAXSN" /><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><title>
	Creatio
</title>
...

 

 

 

Показать все комментарии

Возможно ли такое, что при большом количестве запросов к api было наложено ограничение на выгрузку данных?

Если да, то какие действия нужно предпринять, что бы это ограничение снять ? 

Нравится

1 комментарий

Андрей, специально никаких ограничений не предусмотрено. Возможно, если отправляете много тяжёлых запросов одновременно, происходит снижение скорости выборки из БД, если на всё не хватает ресурсов сервера. Может, и в интеграции что-то делается не так, например, для каждого запроса создаётся новая сессия.

 

Либо Вы столкнулись с ограничением в 20000 записей, которое устанавливается в web.config, если не ошибаюсь, параметр maxEntityRowCount.

 

А как у Вас это проявляется?

Показать все комментарии
Вопрос

Добрый день.

Подскажите пожалуйста как подключиться к нашей Creatio Сервис по API

 каким методом создать и изменить сущность Обращение.

 

Также пробовали настроить веб-сервис в  Creatio если есть успешные кейсы просьба поделиться опытом

Нравится

1 комментарий

Иван, наиболее часто для интеграции, создания и изменения записей в разделе по API извне используют механизм OData. О нём есть серия статей в академии, как его использовать для добавления, изменения и удаления, как обращаться HTTP-запросами напрямую или из автоматически сгенерированных классов в своей программе.

 

Ещё можно более специализированный механизм DataService, по которому браузер общается с сервером при работе с данными в системе.

 

По созданию своего сервиса есть отдельная статья, если создавать обращения извне должен иметь возможность кто угодно, то вообще сервис можно сделать анонимным, без авторизации.

 

И общая статья о выборе способа интеграции.

Показать все комментарии

Возможно ли в раздел по api подтянуть список из другой системы и потом через карточку с виртуальными полями получать данные так же через api. Смысл в том что нужно сделать управление другим сервисом через фронтэнд Creatio.

Изображение удалено.

 

Нравится

7 комментариев

Можно варианты реализации множество навскидку 1) получать данные из сервиса (по аналогии с DataService) 

2) Использовать интеграцию на уровне БД (Linked Servers) и создать виртуальный объект на основе представления. Обсуждалось тут и тут и тут

В общем вариантов много, почитайте все ветки и документацию по интеграции с другими системами.

 

Вариант dblink не подходит так как есть доступ только по webapi.

Получить данные из сервиса я могу, проблема только как данные списка в разделе заставить брать не из базы а с api (полученные любым из способов, хоть через сервис на Бэке)

пишет:

Можно варианты реализации множество навскидку 1) получать данные из сервиса (по аналогии с DataService) 

2) Использовать интеграцию на уровне БД (Linked Servers) и создать виртуальный объект на основе представления. Обсуждалось тут и тут и тут

В общем вариантов много, почитайте все ветки и документацию по интеграции с другими системами.

 

Вариант dblink не подходит так как есть доступ только по webapi.

Получить данные из сервиса я могу, проблема только как данные списка в разделе заставить брать не из базы а с api (полученные любым из способов, хоть через сервис на Бэке)

Можно на сервере БД создать view, получающую информацию от стороннего веб-сервиса и туда же отправляющую в instead-триггерах.

Но обращаться с ней с точки зрения производительности нужно очень осторожно.

Зверев Александр пишет:

Можно на сервере БД создать view, получающую информацию от стороннего веб-сервиса и туда же отправляющую в instead-триггерах.

Но обращаться с ней с точки зрения производительности нужно очень осторожно.

Это выходит что нужно создать или сервис на c# или на уровне базы http клиентом. А можно ли переопределить логику получения списка не из базы данных а по webapi? И наверно резонно подумать что если можно, на сколько это может быть проблематично с дальнейшими обновлениями системы что бы не вышло конфликта так как я понимаю прийдеться  замещать довольно глубокий код. Другими словами стоит ли игра свеч и порванного бубна?

Нужно учитывать, что элементы интерфейса сделаны на уровне ядра, а не конфигурации, и переопределять их в таком случае не всегда возможно.

Также посмотрите статью, где обсуждают нечто подобное, хоть и без интеграции.

Зверев Александр пишет:

Нужно учитывать, что элементы интерфейса сделаны на уровне ядра, а не конфигурации, и переопределять их в таком случае не всегда возможно.

Также посмотрите статью, где обсуждают нечто подобное, хоть и без интеграции.

В общем лучше так не делать, черевато или потерей в производительности или в стабильности. Спасибо за ответ 

Показать все комментарии

В академии описано как другие системы могут в bpm'online ложить данные, изменять и удалять. А как можно что бы bpm'online делала это в другою систему по api?

Суть в том что нужно сделать интеграцию двустороннюю что бы другая система ложила и модифицировала донные в bpm'online, и сама bpm'online так же ложила по событию данные в другую систему и модифицировала их по api

Нравится

5 комментариев
Лучший ответ

Добрый день!

А что за система на другой стороне? Для многих случаев бывают уже готовые решения на маркет-плейсе.

Ну так и разработайте web-сервис который будет принимать данные от сторонней системы и отдавать данные в неё. А в рамках БП отправляйте данные в свою систему.

Добрый день!

А что за система на другой стороне? Для многих случаев бывают уже готовые решения на маркет-плейсе.

Тёскин Дмитрий Валерьевич,

Там система для билинга, в маркете нет такого

В БП есть элемент вызова веб-сервиса с возможностью передать в него значения параметров и загрузки в другие параметры значения из ответа сервиса. Если у интересующей системы есть API для авторизации, нужно будет сначала произвести её, а затем работать с API для управления данными.

Зверев Александр,

я совсем забыл про графический способ подключения к api из bpm'online. Спасибо

Показать все комментарии

Реализовал несколько методов, которые используют API BPM. Все отлично работает от имени пользователя Supervisor, но от любого другого пользователя, с аналогичными правами, сервер возвращает error: "Удаленный сервер возвратил ошибку: (401) Несанкционированный."

Помогите понять в чем косяк...

Нравится

13 комментариев

У пользователя не хватает прав на работу через OData. Где добавить права, см. тут.

Зверев Александр,

добавил... не помогло.

Значит, добавили не всюду, где надо. Там несколько пунктов.

Зверев Александр,

Зверев Александр,

Судя по названию объекта, он может быть связан с какой-то интеграцией, либо иметь какую-либо ещё нестандартную логику. Если через OData нормально читаются все остальные объекты, кроме этого, лучше будет уточнить у его авторов. Проверить работу OData с другими таблицами можно в браузере.

Зверев Александр,

такая же ошибка с доступом и к разделу "Обращения" - можно предположить, что дело совсем не в кастомном справочнике...

Значит, второй пользователь не совсем администратор, каких-то прав у него нет.

Проверьте что ваш пользователь входит в группу системные администраторы, не забудьте актуализировать роли  или раздайте права на доступ к объекту второму пользователю

Григорий Чех,

ничего не помогло...

Григорий Чех,

Опытным путем определил, что проблема действительно с конкретным кастомным справочником... 

В при обращении к другим объектам все работает успешно от пользователей из группы сис. админов.

...к сожалению так и не смог выявить в чем именно проблема.

Перераздайте права на ваш кастомный справочник

например через это приложение

Григорий Чех,

Заработало! Дело не в правах.

Пересоздал справочник: на странице редактирования любого раздела (я в контактах делал) создал поле с типом справочник и сохранил схему.

Далее после перераздачи прав на доступ к объекту и  долгих танцев с бубном (компиляция, редис и т.д.) получил желаемый результат!

Показать все комментарии
Вопрос

Доброго дня,

столкнулся с проблемой, прошу вашей помощи.

при попытке обновлении guid("UsrRegistrationStatusId") с помощью odata используя json формат полезной нагрузки получаю ошибку 

"message": "Cannot convert a primitive value to the expected type 'Edm.Guid'. See the inner exception for more details."
"message": "Guid should contain 32 digits with 4 dashes (xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)."

 привожу пример

http метод put,

передаваемый json  

{

"UsrRegistrationStatusId":"a9d44061-de29-4578-9df6-d2f226573a06",

"UsrTitle":"myvalue",

"UsrFirstName":"myvalue",

"UsrLastName":"myvalue",

"UsrPreferredEmail":"myvalue@mm.mm",

"UsrDateOfBirth":"2019-04-18T11:14:26.697Z",

"UsrOccupation":"myvalue",

"UsrJobTitle":"myvalue",

"UsrCompanyPersonal":"myvalue",

"UsrComment":"myvalue",

"UsrModifiedOn":"2019-04-18T11:14:26.697Z",

"UsrPassportNumber":"myvalue",

"UsrContactNumber":"myvalue",

"UsrDateOfExpiry":"2019-04-18T11:14:26.697Z",

"UsrNationality":"myvalue",

"UsrGuestTypeId":"myvalue",

"UsrMainGuestId":"myvalue",

"UsrIsAccompanyingPerson":"myvalue",

"UsrFlightsModifiedOn":"2019-04-18T11:14:26.697Z"

}

Возможно ли сформировать поля в json  с определенным типом например Edm.Guid ? Было бы круто если покажите пример с описанием типа данных.

Спасибо за внимание!

 

 

Нравится

11 комментариев
Лучший ответ

Привидите полный код формирования запроса с установкой всех служебных заголовков и обратите внимание на примеры для c# 

Представьте Id  Guid в вашем Json как

guid'9d44061-de29-4578-9df6-d2f226573a06'

Спасибо за ответ!

но не помогло  ошибка таже,

urn запроса 0/ServiceModel/EntityDataService.svc/UsrGuestCollection(guid'3b42f755-1f62-4358-878c-47f460ab9e57')

json

{

"UsrRegistrationStatusId":"guid'a9d44061-de29-4578-9df6-d2f226573a06'"

}

полный ответ 

{
  "error": {
    "code": "4",
    "message": {
      "lang": "",
      "value": "An error occurred while processing this request."
    },
    "innererror": {
      "message": "An error occurred while processing this request.",
      "type": "System.Data.Services.DataServiceException",
      "stacktrace": "   at System.Data.Services.Serializers.ODataMessageReaderDeserializer.Deserialize(SegmentInfo segmentInfo)\r\n   at System.Data.Services.Serializers.Deserializer.HandlePutRequest()\r\n   at System.Data.Services.DataService`1.HandlePutOperation(RequestDescription description, IDataService dataService)\r\n   at System.Data.Services.DataService`1.ProcessIncomingRequest(RequestDescription description, IDataService dataService)\r\n   at System.Data.Services.DataService`1.HandleNonBatchRequest(RequestDescription description)\r\n   at System.Data.Services.DataService`1.HandleRequest()",
      "internalexception": {
        "message": "Cannot convert a primitive value to the expected type 'Edm.Guid'. See the inner exception for more details.",
        "type": "Microsoft.Data.OData.ODataException",
        "stacktrace": "   at Microsoft.Data.OData.Json.ODataJsonReaderUtils.ConvertValue(Object value, IEdmPrimitiveTypeReference primitiveTypeReference, ODataMessageReaderSettings messageReaderSettings, ODataVersion version, Boolean validateNullValue)\r\n   at Microsoft.Data.OData.Json.ODataJsonPropertyAndValueDeserializer.ReadPrimitiveValueImplementation(IEdmPrimitiveTypeReference expectedValueTypeReference, Boolean validateNullValue)\r\n   at Microsoft.Data.OData.Json.ODataJsonPropertyAndValueDeserializer.ReadNonEntityValueImplementation(IEdmTypeReference expectedTypeReference, DuplicatePropertyNamesChecker duplicatePropertyNamesChecker, CollectionWithoutExpectedTypeValidator collectionValidator, Boolean validateNullValue)\r\n   at Microsoft.Data.OData.Json.ODataJsonEntryAndFeedDeserializer.ReadEntryProperty(IODataJsonReaderEntryState entryState, IEdmProperty edmProperty)\r\n   at Microsoft.Data.OData.Json.ODataJsonEntryAndFeedDeserializer.ReadEntryContent(IODataJsonReaderEntryState entryState, IEdmNavigationProperty& navigationProperty)\r\n   at Microsoft.Data.OData.Json.ODataJsonReader.ReadAtEntryStartImplementation()\r\n   at Microsoft.Data.OData.ODataReaderCore.ReadImplementation()\r\n   at Microsoft.Data.OData.ODataReaderCore.InterceptException[T](Func`1 action)\r\n   at System.Data.Services.Serializers.EntityDeserializer.ReadEntry(ODataReader odataReader, SegmentInfo topLevelSegmentInfo)\r\n   at System.Data.Services.Serializers.EntityDeserializer.Read(SegmentInfo segmentInfo)\r\n   at System.Data.Services.Serializers.ODataMessageReaderDeserializer.Deserialize(SegmentInfo segmentInfo)",
        "internalexception": {
          "message": "Guid should contain 32 digits with 4 dashes (xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx).",
          "type": "System.FormatException",
          "stacktrace": "   at System.Guid.GuidResult.SetFailure(ParseFailureKind failure, String failureMessageID, Object failureMessageFormatArgument, String failureArgumentName, Exception innerException)\r\n   at System.Guid.TryParseGuidWithDashes(String guidString, GuidResult& result)\r\n   at System.Guid.TryParseGuid(String g, GuidStyles flags, GuidResult& result)\r\n   at System.Guid..ctor(String g)\r\n   at Microsoft.Data.OData.Json.ODataJsonReaderUtils.ConvertStringValue(String stringValue, Type targetType)\r\n   at Microsoft.Data.OData.Json.ODataJsonReaderUtils.ConvertValue(Object value, IEdmPrimitiveTypeReference primitiveTypeReference, ODataMessageReaderSettings messageReaderSettings, ODataVersion version, Boolean validateNullValue)"
        }
      }
    }
  }
}

Так же обратите внимание, на формирование строка запроса, в примере изменения имени контакта с идентификатором 00000000-0000-0000-0000-000000000000 из коллекции контактов ContactCollection.

// Строка запроса:
// PUT <Адрес приложения BPMonline>/0/ServiceModel/EntityDataService.svc/ContactCollection(guid'00000000-0000-0000-0000-000000000000')
// или
// MERGE <Адрес приложения BPMonline>/0/ServiceModel/EntityDataService.svc/ContactCollection(guid'00000000-0000-0000-0000-000000000000')

Григорий Чех,

Сейчас выполняется запрос вида 

 PUT <Адрес приложения BPMonline>0/ServiceModel/EntityDataService.svc/UsrGuestCollection(guid'3b42f755-1f62-4358-878c-47f460ab9e57')

А если без двойных кавычек

Json

{

"UsrRegistrationStatusId":guid'a9d44061-de29-4578-9df6-d2f226573a06'

}

Григорий Чех,

Без двойных кавычек сработает ошибка парсинга json 

{

"UsrRegistrationStatusId":guid'a9d44061-de29-4578-9df6-d2f226573a06'

}

 "message": "Invalid JSON. A token was not recognized in the JSON content."

 

В принципе должно быть

{

"UsrRegistrationStatusId":"a9d44061-de29-4578-9df6-d2f226573a06"

}

А если попробовать поменять простое текстовое поле например Name (если оно есть в вашем объекте) запрос корректно отработает?

Григорий Чех,

Да если менять обычное текстовое поле всё проходит успешно.

Были проблемы с типами данных - числами и датой, та же ошибка с преобразованием типов, на дату решилось преобразованием строки к виду "2019-04-18T11:14:26.697Z" , с числом не получается воспроизвести.

{

"UsrRegistrationStatusId":"a9d44061-de29-4578-9df6-d2f226573a06"

}

На такой формат выводит ошибку приведенную во  2 коментарии 

Привидите полный код формирования запроса с установкой всех служебных заголовков и обратите внимание на примеры для c# 

Прошу прощёния, данном формате запрос работает корректно.

{

"UsrRegistrationStatusId":"a9d44061-de29-4578-9df6-d2f226573a06"

}

Извините что ввёл в заблуждение.

Проявилось не сразу.. запросы выполнял в rest api клиенте после перезапуска клиента данный формат успешно обновил запись.



Премного вам благодарен! Огромное спасибо за ваше время!

Есть и более сложный способ, там не просто голый Guid надо, а с упоминанием названия коллекции, как тут с полом:

{
    Name: 'John',
    BirthDate: new Date(123321123321),
    Gender: {__metadata: { uri: 'GenderCollection(guid\'FC2483F8-65B6-DF11-831A-001D60E938C6\')' }}
}

И в таком случае справочное поле пишется без Id в конце.

Больше примеров в этом обсуждении.

Показать все комментарии

Всем доброго времени суток.

Было бы замечательным реализовать определение откуда "пришло" действие из СРМ или же осуществили добавление/изменение/удаление через API.

Например некий маркер IsFromAPI = true/false

Это касается интеграции по протоколу OData.

1 комментарий

А зачем плодить сущности?

Можно добавить в объект обычное логическое поле IsFromAPI и при записи в объект по OData писать туда true.

Можно завести отдельного пользователя только для интеграций и работать по OData под ним. Тогда всё будет видно в полях «создал» и «изменил».

Показать все комментарии

Было бы неплохо реализовать функционал удаления сущностей из СРМ и всех связанных с ней  записями через API. Данный функционал был бы актуален в связи с нововведениями GDPR 2018 - https://www.eugdpr.org/key-changes.html

Например из системы которая интегрирована с СРМ удаляется пользователь в срм уходит запрос на удаление Контакта и всех связанных с ним записей 

4 комментария

Добрый день, Алексей!



Я передала Ваше пожелание аналитикам продукта. Они рассмотрят возможность реализации данного функционала в одной из будущих версий системы.

А не достаточно ли удалить его персональные данные? Или просто обезличить его, не удаляя активности, продажи и прочее, что влияет не только на Privacy, но и на KPI сотрудников, например?

Добавлю, что обычно в случае интеграции предпочтительнее ставить признак "Удален"/"Не актуален", с сохранением данных (естественно кроме персональных в связи с GDPR) + связанных объектов (задачи, заказы и т.д.)

Добрый день. На Marketplace есть партнерское решение по обезличиванию персональных данных, этого достаточно для выполнения обязательство по GDPR. Посмотрите этот пакет: https://marketplace.bpmonline.com/app/gdpr-compliance-toolkit

Показать все комментарии
Вопрос

Здравствуйте, если возможность просто воспользоваться api bpm-online из приложения asp.net core?

Нравится

1 комментарий

Добрый день, Михаил!

Такая возможность есть. Вы можете ознакомиться с описанием тут: https://academy.terrasoft.ru/documents/technic-sdk/7-12/integraciya-s-s…

Также, можно выбрать один из следующих вариантов интеграции: https://academy.terrasoft.ru/documents/technic-sdk/7-12/vybor-sposoba-i…

Показать все комментарии