Здравствуйте! Коллеги подскажите. Сделал веб сервис

 

namespace Terrasoft.Configuration.Statements 

{

    using System;

    using Terrasoft.Core;

    using System.ServiceModel;

    using Terrasoft.Web.Common;

    using System.ServiceModel.Web;

    using Terrasoft.Core.Entities;

    using System.ServiceModel.Activation;

    [ServiceContract]

    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]

    public class UsrStatements : BaseService

    {

        

        [OperationContract]

        [WebInvoke(Method = "GET", RequestFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped,

        ResponseFormat = WebMessageFormat.Json)]

        public string GetContactList()

        {

            var esq = new EntitySchemaQuery(UserConnection.EntitySchemaManager, "Contact");

            var colName = esq.AddColumn("Id");

            var contacts = esq.GetEntityCollection(UserConnection);

            if(contacts.Count > 0)

            {

                var result = contacts[0].GetColumnValue(colName.Id).ToString();

                return result;

            }

        }

    }

}

При вызове воращает ошибку 404. Вызываю так https://testcrm.com/0/rest/UsrStatements/GetContactList

Авторизовываюсь Supervisor-ом

Версия 7,13

Нравится

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

А компилируется без ошибок?

 

Добрый день. Да. Но в конфигураторе стоит галочка заблокирован

Нурлан,

А генерация исходного кода прошла успешно?

Можете уточнить по галочке - как именно отображается?

Добрый день. Вопрос решен. Ошибка была в браузере. Браузер не показывал некоторые ошибки и соостветвенно публикация не происходило. Спасибо всем.

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

Добрый день.



Подскажите как можно добавить два и более объектов в тип данных collection of records в бизнес процессе? 

Есть web service в котором описывается запрос на сервер, сервер принимает поле fields, это массив объектов. В request parameters описал поле fields https://prnt.sc/1qd03bc При тестировании запроса есть возможность добавить несколько items (объектов) https://prnt.sc/1qd04ct в масив fields.



Вопрос в том, как можно добавить несколько items в масив fields в бизнес процессе где я использую этот web service? https://prnt.sc/1qd07oo

Нравится

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

Непосредственно в элементе вызова веб-сервиса необходимо указать параметры бизнес-процесса, из которых будут читаться данные для передачи. К примеру, сначала выполняется чтение коллекции данных опеределенного объекта, а потом параметры этой коллекции передаются в соответствующие поля.

 

Подробнее и со скриншотами об этом можно прочитать в документации по ссылке, подраздел Передать параметры вызова типа “коллекция“.

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

Добрый день.



Подскажите, пожалуйста, есть ли возможность в web service для "data type: object" установить тип данных объект, а не массив с объектами?



https://prnt.sc/132ydy4

Нравится

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

Добрый день!

Нет, подобную настройку выполнить нельзя. Это не имеет смысла поскольку сам объект это есть контейнер для других полей. Уточните какую задачу Вы решаете, возможно, мы сможем подсказать как ее можно будет выполнить.

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

Доброго дня, имеется 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.

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

При отправке запроса к удалённому серверу 

Получаю ошибку:

 The request was aborted: Could not create SSL/TLS secure channel.

Нравится

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

Добрый день, Игорь.

Обратите внимание сюда.

Мотков Илья,

Спасибо, но это не помогло.

У меня есть подозрение, что ошибка происходит на этапе обращения из клиентской части к web-сервису  bpmonline по ссылке

Мой кейс:

Есть кнопка "прослушать"  в р. Звонки. При отправке запроса при клике на кнопку нельзя передать данные для аутентификации.

Поэтому ссылка для кнопки формируется к web-сервису bpmonline, который в свою очередь отправляет авторизованный запрос к удалённому серверу на получение потока.

CallStack ошибки не отображает вызов метода, который отправляет запрос к удалённому серверу, значит делаю вывод, что ошибка происходит на этапе вызова web-сервиса bpmonline.

Как обойти данную, ошибку ума не приложу.



 

Не видя, кто именно выдал ошибку, сложно сказать наверняка. Если сервер 7.Х, то более подробно будет в логах, если пришла от сервера телефонии, это сообщение будет видно при мониторинге HTTP-траффика от него.

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

Добрый день.

Версия 7.7.0.

Задача: Добавить кнопку в панель действия, по нажатию на которую отправляется SOAP запрос со страницы во внешнюю систему.

Кнопку в панель добавил, а с реализацией web-сервисов еще не знаком.

Где про это можно максимально подробно почитать?

Интересуют все этапы.

Нравится

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

Добрый день!

Надо сделать конфигурационный сервис (смотреть тут), либо бизнес процесс с элементом скриптом, который уже будет запрос со страницы во внешнюю систему. Как сделать запрос во внешнюю систему можно посмотреть тут

Добрый день!

Надо сделать конфигурационный сервис (смотреть тут), либо бизнес процесс с элементом скриптом, который уже будет запрос со страницы во внешнюю систему. Как сделать запрос во внешнюю систему можно посмотреть тут

Сидоров Александр В.,



Добрый день.

Описал сервис:

[WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json, BodyStyle =
		WebMessageBodyStyle.Wrapped,
		ResponseFormat = WebMessageFormat.Json)]
		public string SoapRequest(string Name)
		{
			string _soapEnvelope = "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:bp=\"http://********.ru\">" +
				"<soapenv:Header/>" +
					"<soapenv:Body>" +
						"<bp:CL_Integracija_CRM_Request>" +
							"<client>" +
								"<inn>7811496640</inn>" +
								"<kpp>781101001</kpp>" +
								"<id_abs>19505031632</id_abs>" +
							"</client>" +
							"<loan_app>" +
								"<product_code>вкл</product_code>" +
								"<summ>10000000</summ>" +
								"<term>24</term>" +
								"<rate>9</rate>" +
							"</loan_app>" +
							"<user_in>" +
								"<login>" + Name + "</login>" +
							"</user_in>" +
						"</bp:CL_Integracija_CRM_Request>" +
					"</soapenv:Body>" +
				"</soapenv:Envelope>"; 
			var request = (HttpWebRequest)WebRequest.Create("http://*******************/bp");
			request.Method = "POST";
			byte[] byteArray = Encoding.UTF8.GetBytes(_soapEnvelope);
			request.ContentType = "application/x-www-form-urlencoded";
			request.ContentLength = byteArray.Length;
			request.Timeout = 30 * 1000;
			using (var dataStream = request.GetRequestStream())
			{
				dataStream.Write(byteArray, 0, byteArray.Length);
				dataStream.Close();
			}
			var resp = (HttpWebResponse)request.GetResponse();
			Stream responseStream = resp.GetResponseStream();
			StreamReader sr = new StreamReader(responseStream);
            string s = sr.ReadToEnd();
            return s;
		}

Вызываю его из замещающего клиентского модуля: 

ServiceHelper.callService("UsrCustomConfigurationService", "SoapRequest", function(response) {
						//MaskHelper.HideBodyMask();
						if (response.ProcessRequestResult.ErrorMessage) {
							Terrasoft.utils.showInformation(response.ProcessRequestResult.ErrorMessage);
						} else if (!response.ProcessRequestResult.IsEmpty) {
							Terrasoft.utils.showInformation("Запрос успешно обработан. Файлы отчета прикреплены к заявке.");
						} else {
							Terrasoft.utils.showInformation("Запрос успешно обработан. По выбранному контакту данных нет.");
						}
						window.console.log(response.ProcedureSqlResult);
					}, serviceData, this);

но получаю ошибку: 

В web.config и services.config все прописал, в ServiceModel описание добавил

С чем это может быть связано?

stique,

Убедитесь, что добавлены атрибуты [ServiceContract] у класса и [OperationContract] у метода

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

Возможно ли использование JWT авторизации для подключения веб сервиса, а так же для доступа к API BPM?

Нравится

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

Нет, JWT не поддерживается. 

При интеграции bpm’online с веб-сервисами поддерживается два типа аутентификации: базовая и OAuth 2.0.

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

Коллеги всем доброго времени суток. Нужна Ваша помощь.

В БП есть элемент Web-сервис в  котором есть массив - http://prntscr.com/kyim63.

Данный массив объектов состоит из двух полей Number и Description - http://prntscr.com/kyimnk

Данные поля необходимо заполнять по следующему правилу из двух выборок - http://prntscr.com/kyin8y

Правила заполнения реализовал следующим образом через тернальные выражения в формуле поля - http://prntscr.com/kyio17http://prntscr.com/kyioa3

Но при отработке элемента Web-сервис видим что массив Communications пустой - http://prntscr.com/kyip7z

Если же посмотреть на данные трассировки двух элементов из которых должна осуществляться выборка видим:

Идем в "Читать Контакты СТО в платформе" - http://prntscr.com/kyiq70 здесь по нулям следовательно логике должно брать значение из другого элемента, идем в "Читать Основной контакт Контрагента" - http://prntscr.com/kyir2v, здесь данные есть, вопрос почему не заполнились в веб-сервисе?

Заранее благодарю за ответ.

Нравится

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

Нужно ещё больше ссылок на prntscr.com.angry

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

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

Товарищи помогите.

БЦ  дергает код на сервере, этот код забирает данные из другой системы и обновляет запись контрагента путем прямого SQL запроса.

Все работает  но проблема с обновление пользовательского интерфеса.(Ну тобишь пользователь должен в интерактиве увидеть результат). Сейчас  я в клиенском коде кручу в потоке jQuery таймер и тыкаюсь в БД проверяя наличие изменений и вывожу диалоговое окошко. Но данный подход, мне уж больно не нравится.

Есть ли способ из внешней системы путем сетевого запроса, вывести модальное окно у конкретного пользователя? Или какие иные подходы существуют

 

Нравится

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

Чисто в теории:

- код на сервере помимо sql-вставок, генерирует сигнал по web-socket, что изменена запись

-на клиенте развернуть listener, будет принимать сигнал, выдавать пользователям сообщение

Чисто в теории:

- код на сервере помимо sql-вставок, генерирует сигнал по web-socket, что изменена запись

-на клиенте развернуть listener, будет принимать сигнал, выдавать пользователям сообщение

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

Добрый день!

Интересует несколько вопросов, связанных с использованием web-сервисов:

1) Доступна ли  basic авторизация  для ProcessEngineService.svc а так же для кастомных конфигурационных сервисов? 

2) И если 1- да, то как правильно передать параметры авторизации?

Использую вебсервис так:

http://site/0/ServiceModel/ProcessEngineService.svc/RunProcess



{"parameterValues":

[

{"name":"Title","value":"TestValue1"},

{"name":"Description","value":"TestValue2"},

{"name":"Action","value":"TestValue3"}

],

"schemaUId":"AF7E3F40-0EFA-431A-94AA-4DEEFFE16E59",

"schemaName":"UsrCaseIntegrationProcess"}

 

Нравится

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

С авторизацией разобрался

Появился новый вопрос - как вернуть результат выполнения процесса. Как проавильно прописать в POST запрос ResultParameterName

Бакалов Павел Вячеславович,

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

Примеры запроса есть тут: https://academy.terrasoft.ru/documents/technic-sdk/7-12/web-servis-proc…

 

Tsopa,

Да, процесс компилируемый. Руководствуясь данной инструкции удалось выполнить процесс, передать параметры и получить результат используя метод GET. Но в инструкции написано, что так же можно использовать метод POST. Но у меня не вышло это сделать - процесс выполнился, но параметры в него не попали и результат соответственно не вернулся. Нет ли примеров POST запросов к методу Execute ?

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

Александр, спасибо конечно, но это метод RunProcess, который я привел в самом начале своего поста. А меня интересует вызов метода Execute, так как в нем есть возможность вернуть результат выполнения процесса в виде параметра процесса.

Бакалов Павел Вячеславович,

POST запрос к методу Execute  не рекомендуется отправлять, поскольку  операция устарела, вместо этого стоит отправлять запрос /RunProcess.

Но если необходимо отправить POST запрос к Execute это можно сделать следующим образом: 

schemaName - эта название схемы процесса, который необходимо запустить

https://[site]/0/ServiceModel/ProcessEngineService.svc/[schemaName]/Execute

пример Header: 

Content-Type: application/json

BPMCSRF: BgsjByc16fsEZfuAr/CxDO

Cookie: BPMLOADER=vuhtzmo2wh2mxgb1amggorf2; .ASPXAUTH=FFF4F....; BPMCSRF=BgsjByc16fsEZfuAr/CxDO;

пример body: 

{}

 

как Вы решили проблему Basic авторизации?

См. тут. А вообще, базовую не рекомендуют, вот её сравнение с Cookies.

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