Вопрос

ProcessEngineService.svc и метод POST

Добрый день! В документации по разработке, в статье о ProcessEngineService говорится:

Вызов метода Execute() можно выполнять с помощью HTTP-запросов GET и POST.

В посте от 14 года среди ответов есть следующий:

Добрый день.К сожалению, передача параметров в потоке метода POST в текущих версиях bpm’online не реализована.

Скажите, пожалуйста, существует ли сейчас возможность передачи параметров в бизнес-процесс в теле post-запроса? И если существует, то очень хотелось бы посмотреть пример реализации, потому что у меня упорно не получается передать параметры (при этом, через GET всё работает)

У меня такой же вопрос

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

Добрый день, Иван!

Такая возможность есть, 

Пример: 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-запроса ?

Ігор Андрусенко,

К сожалению, в версии 5.4 такая возможность не реализована. 

Добрый день!

Каким образом при вызове процесса через 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.

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

Войдите или зарегистрируйтесь, чтобы комментировать