Добрый день,

 

подскажите пожалуйста, столкнулись с неизвестной ошибкой получения данных о контакте используя протокол odata4. Пример запроса:

curl --location --request GET 'https://ht-lab.terrasoft.ru/0/odata/Contact(ebd2424b-6aad-422e-9bb4-b93f11d5f0db)' \

--header 'ForceUseSession: true' \

--header 'BPMCSRF: -----' \

--header 'Content-Type: application/json; charset=UTF-8'

В ответе ошибка:

{ "error": { "code": "", "message": "An error has occurred." } }

Запрос на получение списка всех контактов возвращает аналогичную ошибку.

В чем может быть причина?

Нравится

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

Владимир, попробуйте опубликовать объект «Контакт» в конфигурации. Если этого будет недостаточно, нужно будет смотреть в логах сайта подробности ошибки.

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

Спасибо, "опубликовать" помогло.  Раньше обычно делал компиляцию измененных элементов, сейчас это уже не срабатывает.

Вадим, при добавлении/изменении объектов нужно публиковать для каждого именно его схему, чтобы отработало обновление структуры таблицы в БД, создались новые поля. Для других типов компилируемых схем (БП, действия, в 5.Х-интерфейсе были и страницы) это уже не обязательно, достаточно, чтобы опубликовалась любая.

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

При обращении к обьекту UsrBonus(https://0937113-pharm-zakaz.terrasoft.ru/0/odata/UsrBonus?$top=10) получаем ошибку 

{"error":{"code":"","message":"An error has occurred."}}

Подскажите, в чем может быть причина ошибки?

Нравится

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

Альмир, проверил на стандартном разделе, ошибки не наблюдается.

Может, после доработок не опубликовали схему объекта UsrBonus?

Если это не поможет, нужно смотреть подробности об ошибке в логах системы за этот момент. Поскольку сайт находится в «облаке», такую информацию можно получить, обратившись к поддержке.

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

Добрый день!



Планирую интеграцию одного приложения с Creatio CRM через внешний API на OData4.

Читаю документацию, и вижу, что любую сущность можно получить через отдельный запрос. Но изначально система не знает какие сущности могут быть в системе, и чтобы получить их список нужно выполнить SQL-запрос (по инстркуции):

 

для MySQL

SELECT * FROM INFORMATION_SCHEMA.TABLES

для Oracle

SELECT * FROM ALL_TABLES

для PostgreSQL

SELECT table_name FROM information_schema.tables

 

У меня есть только данные для авторизации юзера через OData4, и этот запрос мне никак не выполнить.



Есть ли какой-то способ через внешний API получить список всех таблиц?

Нравится

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

Павел, можно ещё

https://{server}/0/odata/

Так будет результат в  JSON.

 

Либо воспользоваться информацией из таблицы SysSchema, которая тоже доступна по OData. За объекты отвечает EntitySchemaManager, получить список можно с таким фильтром:

https://{server}/0/odata/SysSchema?$filter=ManagerName%20eq%20%27EntitySchemaManager%27

А вариант с выбором из базы не очень подходит, поскольку зависит от платформы, плюс не все таблицы в базе связаны с объектами конфигурации и могут быть доступны по OData. И наоборот, часть объектов сделаны не на основе table, а по view.

Нашел сам



Запрос на 

https://{server}/0/odata/$metadata

возвращает внутри <Schema Namespace="Terrasoft.Configuration.OData" xmlns="http://docs.oasis-open.org/odata/ns/edm"> все сущности

Павел, можно ещё

https://{server}/0/odata/

Так будет результат в  JSON.

 

Либо воспользоваться информацией из таблицы SysSchema, которая тоже доступна по OData. За объекты отвечает EntitySchemaManager, получить список можно с таким фильтром:

https://{server}/0/odata/SysSchema?$filter=ManagerName%20eq%20%27EntitySchemaManager%27

А вариант с выбором из базы не очень подходит, поскольку зависит от платформы, плюс не все таблицы в базе связаны с объектами конфигурации и могут быть доступны по OData. И наоборот, часть объектов сделаны не на основе table, а по view.

Зверев Александр, Спасибо! А метадату конкретной сущности как получить? 

Требуется узнать какие поля у модели.

В https://{server}/0/odata/$metadata всё есть.

Pavel Buev,

Добрый день Павел, нашли решение получение метадаты конктретной сущности? ищу рещение такой же проблемы

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

Добрый день! Пытался обновить версию OData по инструкции:

https://academy.terrasoft.ru/documents/technic-sdk/7-16/integraciya-s-creatio-po-protokolu-odata-4?_ga=2.183260710.1232967641.1598249864-1095365786.1598249864

 

Добавил в Web.Config, который находится в корневой папке в блок 

строку:

Сохранил файл конфигурации.

Следующий запрос через Postman для проверки возвращает статус 404: 

http://myapp/0/odata/Employee?$filter=FullJobTitle eq 'Developer' and Account/Name ne 'Our company'

 

В то же время запрос для версии OData 3 возвращает статус 200:

http://myapp/0/ServiceModel/EntityDataService.svc/EmployeeCollection?$f… eq 'Developer' and Account/Name ne 'Our company'

 

Полная компиляция, очистка редис и перезапуск приложения в IIS не помогло.

Версия продукта 7.15.0.634

Нравится

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

Никита, нужно добавить не во внешний, а во внутренний Web.Config, который в папке Terrasoft.WebApp.

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

Доброго дня, имеется bpm которая при GET запросе 0/ServiceModel/EntityDataService.svc/ContactColletion возвращает xml с контактами, можно ли GET запросом возвращать JSON и если да, то где про это написанно? Если нельзя, то как вернуть JSON для oData 3?

Нравится

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

Добавьте header к запросу

Accept: application/json;odata=verbose

Добавьте header к запросу

Accept: application/json;odata=verbose

я смог сделать это в постмане, но все же не понятно, мб подскажете возможно ли в террасофте возвращать json по обращению к uri, если можно сделать это не переписывая сервис, буду благодарен за подсказку)

условно я иду по адресу /0/ServiceModel/EntityDataService.svc/ContactCollection и мне падает 

 

{

    "d": {

        "results": [

            {

                "__metadata": {

                    "id": "http://localhost:85/0/ServiceModel/EntityDataService.svc/ContactCollect…",

                    "uri": "http://localhost:85/0/ServiceModel/EntityDataService.svc/ContactCollect…",

                    "type": "Terrasoft.Configuration.Contact"

                },

                "Photo": {

                    "__deferred": {

                        "uri": "http://localhost:85/0/ServiceModel/EntityDataService.svc/ContactCollect…"

                    }

                },

                "Owner": {

                    "__deferred": {

                        "uri": "http://localhost:85/0/ServiceModel/EntityDataService.svc/ContactCollect…"

                    }

...и т.д.

Насколько понял, только заголовком. Такой формат здесь не поддерживается: «ContactCollection?$format=json». А в OData 4 по умолчанию идёт JSON.

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

Добрый день, коллеги!

 

Недавно вышло обновление к Creatio, где расширили функционал oData, а точнее добавили действие upsert, я хотел бы узнать, как правильно генерировать данный запрос?

Я работаю через postman.

 

Заранее спасибо!

Нравится

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

Михаил, для того, чтобы сделать upsert, нужно выполнить patch-запрос с указанием id в списке полей. Раньше если записи не было, возвращало ошибку, сейчас производится вставка. А если есть, то и раньше, и сейчас — изменение. Готовых именно таких примеров нет, о patch есть в справочнике по API.

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

Добрый день!

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

Отправляю запрос в следующем виде:

https://mysite/0/odata/Case?$filter=StatusId eq guid'7e9f1204-f46b-1410-fb9a-0050ba5d6c38'

получаю ответ:

{
    "error": {
        "code": "",
        "message": "The query specified in the URI is not valid. Unrecognized 'Edm.String' literal 'guid'7e9f1204-f46b-1410-fb9a-0050ba5d6c38'' at '12' in 'StatusId eq guid'7e9f1204-f46b-1410-fb9a-0050ba5d6c38''."
    }
}

 

Какие комбинации я только не пробовал:

https://mysite/0/odata/Case?$filter=StatusId/Id eq guid'7e9f1204-f46b-1410-fb9a-0050ba5d6c38'

https://mysite/0/odata/Case?$filter=StatusId eq guid'7e9f1204-f46b-1410-fb9a-0050ba5d6c38'

https://mysite/0/odata/Case?$filter=StatusId eq '7e9f1204-f46b-1410-fb9a-0050ba5d6c38'

и т.д. - результат один и тот же - ошибка 400

 

При этом если я делаю запрос по колонке с данными типа string - запрос отрабатывает корректно и возвращает ответ 200, например так:

https://mysite/0/odata/Case?$filter=Number eq 'SR00000262'

 

Что я делаю не так?

Нравится

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

Должно работать так:

https://mysite/0/odata/Case?$filter=Status/Id eq 7e9f1204-f46b-1410-fb9a-0050ba5d6c38

 

Должно работать так:

https://mysite/0/odata/Case?$filter=Status/Id eq 7e9f1204-f46b-1410-fb9a-0050ba5d6c38

 

Спасибо, теперь ответ приходит корректный.

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

Добрый день!

Отправляю к сервису OData PATCH-запрос и он падает с 404 ошибкой. При этом GET запрос отрабатывает и возвращает необходимые данные. Может кто-нибудь подсказать, что делать в данной ситуации?

Нравится

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

Без примеров запросов и ответов на них сложно сказать. Возможно, PATCH идёт к другому адресу или составлен неправильно.

 

Описание формата запросов, в том числе и PATCH, для OData 3 и OData 4 есть в академии.

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

Добрый день.

 

Мы используем OData для интеграции с другими системами. В последнее время наблюдается странное поведение системы, на одни и те же запросы Creatio может отвечать как штатно, так и с ошибкой 401. 

{
"Message":"There was an error processing the request.",
"StackTrace":"",
"ExceptionType":""
}

 

Подскажите, кто-нибудь сталкивался с подобным?

Нравится

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

401 — это Unauthorized:

для доступа к запрашиваемому ресурсу требуется аутентификация. В заголовке ответ должен содержать поле WWW-Authenticate с перечнем условий аутентификации. Иными словами, для доступа к запрашиваемому ресурсу клиент должен представиться, послав запрос, включив при этом в заголовок сообщения поле Authorization с требуемыми для аутентификации данными. Если запрос уже включает данные для авторизации, ответ 401 означает, что в авторизации с ними отказано.

Значит, перед работой с OData не обратились к AuthService.svc, либо обратились, но в дальнейших запросах не передали все полученные куки, либо отвалилось по давности.

Также см. более подробную статью, как правильно производить аутентификацию. Возможно, забыли о заголовке ForceUseSession: true.

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

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

Например, я хочу получить только клиентов своего дистрибьютора. Отправляю вот такой запрос:

http://crm.shymkentpivo.kz:82/0/ServiceModel/EntityDataService.svc/Acco… eq guid'e63ac989-9760-4453-b45f-943e906447e8'

Но в ответ мне приходит выборка из клиентов не только моего дистрибьютора.

Нравится

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

Добрый день!

В первом запросе у вас ошибка перед словом filter: должен использоваться знак $ вместо &

Также я делаю запрос

http://crm.shymkentpivo.kz:82/0/ServiceModel/EntityDataService.svc/Docu… eq guid'e63ac989-9760-4453-b45f-943e906447e8'

Чтобы получить заказы только своего дистрибьютора, и я подозреваю что в ответе мне приходят рандомные заказы, без учета фильтра.

Тестирую запросы в Postman

Добрый день!

В первом запросе у вас ошибка перед словом filter: должен использоваться знак $ вместо &

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