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

Нравится

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

Добавьте 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.

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

Добрый день!

Столкнулся со следующей ситуацией: 
При запросе авторизации к AuthService через fiddler возвращаются данные BPMCSRF, и при запросе к кастомному сервису указывая данный аттрибут в хэдере запроса получаю ответ 200, ок.
Однако, при программном вызове AuthService через метод, предоставленный на статье академии (TryLogin) и при запросе к сервису с данными Cookie получаю ответ 403 - запрещено. Ошибка возникает, т.к. нет отдельного хэдера BPMCSRF содержащего значения из Cookie.

Вопрос, как добавить данные  BPMCSRF в запрос программно?

Нравится

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

Здравствуйте, Дмитрий.

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

 CookieCollection cookieCollection = AuthCookie.GetCookies(new Uri(authServiceUri));
    string csrfToken = cookieCollection["BPMCSRF"].Value;
    ((HttpWebRequest)e.Request).Headers.Add("BPMCSRF", csrfToken);

Детали по ссылке - https://academy.terrasoft.ru/documents/technic-sdk/7-12/zashchita-ot-cs…

Сергей Кy6риш,

Сергей, спасибо, все получилось.

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

Здравствуйте!

Не могу получить конкретную системную настройку из клиентского кода (ошибка на скриншоте) на пользователях-аутсорсерах (не входят в роль "Все сотрудники компании", если это важно). При этом эта же настройка нормально загружается для остальных пользователей, этот же пользователь нормально получает другие настройки. Пересоздавать настройку пробовал, не помогает. В чем может быть дело/как починить?

Нравится

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

Здравствуйте!

Уточните, пожалуйста, как именно Вы получаете значение системной настройки? Есть листинг кода? 

 

Вильшанский Дмитрий, 

this.Terrasoft.SysSettings.querySysSettingsItem('SlaCalculationEnabled', function (slaEnabled) {console.log(slaEnabled)})

При этом если запросить какую-нибудь несуществующую настройку, то ошибка не выводится, приходит просто undefined

Добрый день.

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

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

Добрый день, Коллеги.

Имел ли кто дело с реализацией анонимной аутентификации внешних запросов, например, к написанному Вами web-сервису по аналогии с сервисом оценок обращений?

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

Нравится

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

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

Этот функционал разработан для продукта Service, соответственно требует наличия этого продукта в Вашей системе. Инструкция по настройке веб-сервисов, доступных без авторизации:

 

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

  • в WebApp\ServiceModel зарегистрировать веб-сервис, в котором будет указан путь к конфигурационному веб-сервису. Например, <Название сервиса>.svc, с содержимым:
<%@ ServiceHost Language="C#" Debug="true" Service="Terrasoft.Configuration.<Название сервиса>" %>
  • в WebApp\Web.config добавить:
<location path="ServiceModel/<Название сервиса>.svc">
  <system.web>
    <authorization>
      <allow users="*" />
    </authorization>
    </system.web>
</location>
  • в WebApp\Web.config секции appSettings изменить значение ключа AllowedLocations. В значение добавить:
ServiceModel/<Название сервиса>.svc
  • в конфигурации реализовать веб-сервис. Например:
namespace Terrasoft.Configuration 
{
         using System;
         using System.Runtime.Serialization;
         using System.ServiceModel;
         using System.ServiceModel.Activation;
         using System.ServiceModel.Web;
         using System.Web;
         using Terrasoft.Core;
         using Terrasoft.Web.Common;

 
         [ServiceContract]
         [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]
         public class ConfigurationService : BaseService
         {

 
                 private SystemUserConnection _systemUserConnection;
                 private SystemUserConnection SystemUserConnection {
                          get {
                                   return _systemUserConnection ?? (_systemUserConnection = (SystemUserConnection)AppConnection.SystemUserConnection);
                          }
                 }

 
                 [OperationContract]
                 [WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped, ResponseFormat = WebMessageFormat.Json)]
                 public void Post() {
                 }

 
                 [OperationContract]
                 [WebGet(RequestFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped, ResponseFormat = WebMessageFormat.Json)]
                 public void Get() {
                 }
         }
}
  • в WebApp\ServiceModel\http|https\services.config добавить:
<service name="Terrasoft.Configuration.<Название сервиса>">
  <endpoint name="<Название сервиса>EndPoint"
    address="" 
    binding="webHttpBinding"
    behaviorConfiguration="RestServiceBehavior"
    bindingNamespace="http://Terrasoft.WebApp.ServiceModel"
    contract="Terrasoft.Configuration.<Название сервиса>" />
</service>

Сервис будет доступен по адресу WebApp/<Номер конфигурации>/ServiceModel/<Название веб-сервиса>.svc/<Название веб-метода>

Т.к. пользователь не авторизирован, то UserConnection не будет проинициализирован (Session["UserConnection"] == null).

 

Добрый день! 
Настроил анонимный веб-сервис по инструкции. С авторизованным пользователем отрабатывает, а без авторизации сервер возвращает 302. Кто нибудь сталкивался с такой проблемой?

Руслан, значит, получился не анонимный. Может, его неправильно включили на уровне настроек сайта в конфигах?

Много раз перепроверил все, безрезультатно. Единственное, заметил что название сервиса длинное было. Создал другой сервис с коротким названием, он работает. Длинное переделал на короткое, тоже заработало. Может дело не в этом, но мне помогло.

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

 

Ну и наоборот, в БП элементе вызова веб-сервиса есть лимит на длину названия в поле Code в методе вызова внешнего веб-сервиса, со слишком длинным сохранить нельзя.

 

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

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