Добрый день! В документации по разработке, в статье о ProcessEngineService говорится:
Вызов метода Execute() можно выполнять с помощью HTTP-запросов GET и POST.
В посте от 14 года среди ответов есть следующий:
Добрый день.К сожалению, передача параметров в потоке метода POST в текущих версиях bpm’online не реализована.
Скажите, пожалуйста, существует ли сейчас возможность передачи параметров в бизнес-процесс в теле post-запроса? И если существует, то очень хотелось бы посмотреть пример реализации, потому что у меня упорно не получается передать параметры (при этом, через GET всё работает)
Нравится
Добрый день, Иван!
Такая возможность есть,
Пример: URI /0/ServiceModel/ProcessEngineService.svc/RunProcess
Body
{"parameterValues":[{"name":"TextParameter","value":"TestValue."}],"schemaUId":"9c7ff5ab-5808-4b1c-9c9e-e66537c00cf8","schemaName":"UsrProcess1"}
Tsopa,
Спасибо большое, сработало! Подскажите ещё, пожалуйста, как передать json в value? Обычный текст передается корректно, а json не ловится из бизнес-процесса.
Tsopa,
Всё заработало, и json передался. Спасибо большое!
Tsopa,
Добрый день!
А что указать в Body, чтобы в ответе получить значение параметра с именем "Result" (имя для примера указал)?
А теперь более подробно мой вовпрос.
Есть БП с текстовым параметром (TextResult), целочисленным параметром (IntResult), идентификатор (AccountId). В БП я задаю им определенные значения, явно отличные от пустой строки, нуля и пустого Guid. После выполнения БП я хочу получить результирующее значение любого параметра.
Пробовал как указано на академии Get запрос делать прямо в строке браузера http://localhost:8082/0/ServiceModel/ProcessEngineService.svc/TestProce…
ответ: <string xmlns="http://schemas.microsoft.com/2003/10/Serialization/">null</string> ---- null, вместо текста который должен был быть результатом.
на запрос http://localhost:8082/0/ServiceModel/ProcessEngineService.svc/TestProce… получаю ответ <string xmlns="http://schemas.microsoft.com/2003/10/Serialization/">0</string> ---- опять ноль, хотя указывал разные целые числа
ну и для Guid ответ <string xmlns="http://schemas.microsoft.com/2003/10/Serialization/">"00000000-0000-0000-0000-000000000000"</string> --- снова ноль.
НО входящие значения параметров БП применяются и всё отлично.
Если из js делаю post запрос как вы предложили, то надеюсь получу результат, правда не знаю как указать ResultParameterName=TextResult...
Вот код
var bpUrl = Terrasoft.workspaceBaseUrl +'/ServiceModel/ProcessEngineService.svc/RunProcess'; var data = { "schemaName":"TestProcess", "resultParameterName":"TextResult" //пробовал и с заглавной буквы ResultParameterName }; var result = Terrasoft.AjaxProvider.request({ url: bpUrl, headers: { 'Accept': 'application/json', 'Content-Type': 'application/json' }, method: "POST", jsonData: data, scope: this, callback: function(request, success, response) { var responseObject = Terrasoft.decode(response.responseText); debugger; //здесь останавливаюсь и получаю //см скриншот } });
Нет TextResult !!!
Помогите плиз, или может хоть кто знает почему GET запрос пустые параметры возвращает.
C GET разобрался. Нужно обязательно компилировать код, даже если простая формула.
Вопрос с POST запросом в силе.
Степин Константин Владимирович,
Если рассматривать метод Execute, то возможности отправлять параметры в теле POST запроса нет. Также, не рекомендуется отправлять POST запросы к методу Execute так как он устарел. Вместо этого стоит воспользоваться методом /RunProcess.
Пример POST-запроса:
https://[site name]/0/ServiceModel/ProcessEngineService.svc/RunProcess
пример Header:
Content-Type: application/json
BPMCSRF: BgsjByc16fsEZfuAr/CxDO
Cookie: BPMLOADER=vuhtzmo2wh2mxgb1amggorf2; .ASPXAUTH=FFF4F....; BPMCSRF=BgsjByc16fsEZfuAr/CxDO;
пример Body:
{"schemaName":"Process3", "parameterValues"[{"name":"UsrParam","value":"TestValue"}]}
Также примет POST-запроса к Execute:
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:
{}
Tsopa,
Это именно то что я искал, спасибо!
Tsopa,
Я так понимаю, что в версии 5.4 нету шансов отправить параметры в теле POST-запроса ?
Добрый день!
Каким образом при вызове процесса через ProcessEngineService.svc / RunProcess можно получить результат выполнения этого процесса в виде переменной этого процесса.
В теле запроса что и как прописать, чтобы получить значение параметра процесса после его выполнения?
Пробовал в тело запроса прописать значения переменной: "resultParameterName": "Result". Но к сожалению не возвращается значение параметра Result?
Приходит ответ в следующем виде:
{ "ErrorInfo": null, "success": true, "processId": "7a71fb9e-536e-4d85-817b-e70b6c17c4a8", "processStatus": 1}
В статье есть пример получения результата:
Web-cервис ProcessEngineService.svc позволяет запустить определенный бизнес-процесс и получить результат выполнения этого процесса через заданный параметр. Для этого необходимо вызвать метод Execute() в следующем формате:
http[s]://<адрес_приложения_bpm'online>/0/ServiceModel/ProcessEngineService.svc/PROCESSSCHEMANAME/Execute?ResultParameterName=RESULTPARAMETERNAME[&<опциональные входящие параметры бизнес процесса>],где
- PROCESSSCHEMANAME — название схемы процесса, экземпляр которого необходимо запустить на выполнение;
- RESULTPARAMETERNAME — имя параметра процесса, который хранит результат выполнения процесса. Если этот параметр не задан, то web-сервис запустит указанный бизнес-процесс без ожидания результата его выполнения.
ВАЖНО
Если в вызываемом процессе отсутствует параметр с именем RESULTPARAMETERNAME, web-сервис вернет значение null.
Например, необходимо выполнить запуск бизнес-процесса CustomProcess. Результат выполнения процесса хранится в исходящем параметре процесса CustomProcessResult и возвращается в запросе. Дополнительно в процесс CustomProcess передается параметр incomeParam со значением "IncomeParamValue". Тогда строка GET-запроса будет следующей:
.../0/ServiceModel/ProcessEngineService.svc/CustomProcess/Execute?ResultParameterName=CustomProcessResult&incomeParam=IncomeParamValueРезультат выполнения метода Execute() возвращается в виде строки, содержащей JSON-объект (допустимо получение значения null). Десериализация JSON-объекта и приведение полученного результата к определенному типу данных должны выполняться в коде, вызывающем web-сервис.
Зверев Александр,
Интересует получение результата POST запроса с передачей данных в теле запроса в JSON формате. Результат такого запроса хотим получить в формате JSON.
Из всего этого понимаю:
1. Что метод RunProcess можно вызвать и передать в него тело запроса, но сформированый результат он не вернет?
2. Для получения сформированного результата нужно еще будет сделать запрос методом Execute, который должен вернуть сохраненьй в системе результат процесса, который был вызван методом RunProces в 1-м пункте?
Выше написано:
Вызов метода Execute() можно выполнять с помощью HTTP-запросов GET и POST.
Зверев Александр,
все что передаем в теле запроса методом Execute бизнес-процесс не может прочитать.
Лишь через RunProcess бизнес-процесс видит тело запроса.
Как подготовить тело запроса для метода Execute, чтобы бизнес-процесс обработал данные?
Если в теле не видит, попробуйте передавать в адресе, как в GET.
методом GET нельзя передавать большие объемы информации, потому что данные, передаваемые этим методом входят в соств URL, длина которого ограничена
Если передаются большие объёмы, то и процесс, скорее всего, будет выполняться не мгновенно. Возможно, лучше не ждать его завершения, а пересмотреть архитектуру запуска сервиса. Например, из БП запускать вызов веб-сервиса (уже в противоположную сторону) или писать результаты в какую-то таблицу, а потом забирать по OData.