...

Не создаются процессы через WebAPI

Тема в разделе "Проблемы/ошибки", создана пользователем TheShiroO, 9 апр 2018.

  1. TheShiroO

    TheShiroO New Member

    Добрый день!

    Пытаюсь написать на php скрипт, который будет делать запрос к WebAPI ELMA для создания в ней процесса. Перед этим делал запросы из php скрипта для создания объектов, вроде, всё получается. Не сразу, но всё же разобрался с помощью документации как делать запрос для создания/редактирования объектов в ELMA. А вот о процессах в документации ничего не нашёл. И в интернете не увидел каких-нибудь примеров с кодом как должен выглядеть запрос.

    Проблема заключается в том, что мне ELMA никакого ответа не возвращает, даже ошибки никакой нет, что, например, не правильно запрос составлен. Авторизация проходит успешно. Повторюсь с другими объектами работать получается, например адреса.

    Знает ли кто как это должно делаться? Может есть у кого пример кода скрипта, который работает с процессами?
     
  2. pushkarev

    pushkarev Active Member

    А можете привести пример кода, которым вы запускаете процесс?
     
  3. TheShiroO

    TheShiroO New Member

    Делаю я это следующим образом:
    Есть 2 файла. Первый файл содержит класс для отправки запросов к API.

    $curl = curl_init();
    switch ($method)
    {
    case "POST":
    curl_setopt($curl, CURLOPT_POST, 1);
    curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "POST"); //changed curl var

    if ($data) {
    //@todo: will fail if pass is not empty
    $data_string = json_encode($data);//json_encode($data);
    curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
    print_r(array($data,$data_string));
    } else {
    //for empty password
    //echo "++++";

    $data_string = json_encode($data);
    curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
    }
    break;
    case "PUT":
    curl_setopt($curl, CURLOPT_PUT, 1);
    break;
    default:
    if ($data) {
    $url = sprintf("%s?%s", $url, http_build_query($data));
    }
    }
    echo $url."<br>";
    $headers = array(
    "Connection: close",
    "Content-Type: application/json; charset=utf-8", //

    );

    if(!empty(self::$authInfo['AuthToken'])) {
    $headers[] = "AuthToken: ".self::$authInfo['AuthToken'];
    } else {
    //app token only on authorization
    $headers[] = "ApplicationToken: ".self::$appToken;
    }

    if(!empty(self::$authInfo['SessionToken'])) {
    $headers[] = "SessionToken: ".self::$authInfo['SessionToken'];
    }
    print_r($headers);
    curl_setopt($curl, CURLOPT_URL, $url);

    if($method == "POST") {
    //curl_setopt($curl, CURLOPT_POST, 1);
    curl_setopt($curl, CURLINFO_HEADER_OUT, true); //TRUE для отслеживания строки запроса дескриптора
    //curl_setopt($curl, CURLOPT_HEADER , 1); //вернуть заголовки
    curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 10); //время ожидания в сек
    }


    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
    //curl_setopt($curl_exect, CURLOPT_HEADER, true);
    curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);

    $response = curl_exec($curl);


    И второй класс наследник от первого, который хранит методы для разных запросов (Load/Insert/Update).

    $path = "http://{}/API/REST/Workflow/StartProcess/3988af59-6e19-4b7c-8b17-056b42a56d74";
    $requestData = self::queryBody($data);
    $answ = parent::sendRequestCurl("POST", $path, $requestData);

    Тело запроса:
    $request = @'
    {
    ""Items"":
    [
    {
    ""Data"":null,
    ""DataArray"":[],
    ""Name"":""ProcessHeaderId"",
    ""Value"":""""
    },
    {
    ""Data"":null,
    ""DataArray"":[],
    ""Name"":""ProcessToken"",
    ""Value"":""""
    },
    {
    ""Data"":null,
    ""DataArray"":[],
    ""Name"":""ProcessName"",
    ""Value"":""Тестовый процесc""
    },
    {
    ""Data"":null,
    ""DataArray"":[],
    ""Name"":""Status"",
    ""Value"":""Запуск""
    },
    {
    ""Data"":{
    ""Items"":
    [
    {
    ""Data"":null,
    ""DataArray"":[],
    ""Name"":""Status"",
    ""Value"":""status""
    },
    ],
    ""Value"":null
    },
    ""DataArray"":[],
    ""Name"":""Context"",
    ""Value"":null
    },
    ],
    ""Value"":null
    }';


    И есть файл, который вызывает эти методы.
     

    Вложения:

    • Documents.rar
      Размер файла:
      3,3 КБ
      Просмотров:
      0
    • Documents.rar
      Размер файла:
      3,3 КБ
      Просмотров:
      0
    • Documents.rar
      Размер файла:
      3,3 КБ
      Просмотров:
      0
  4. alexfuse

    alexfuse Member

    PHP:
     protected function sendToCRM($data$url_command$headers)
        {

            
    #Формируем ссылку для запроса
            
    $link $this->host $url_command;


            
    $curl curl_init(); #Сохраняем дескриптор сеанса cURL
            #Устанавливаем необходимые опции для сеанса cURL
            
    curl_setopt($curlCURLOPT_RETURNTRANSFERtrue);
            
    curl_setopt($curlCURLOPT_USERAGENT__CLASS__);
            
    curl_setopt($curlCURLOPT_URL$link);
            if (
    $data != '') {
                
    curl_setopt($curlCURLOPT_CUSTOMREQUEST'POST');
                
    curl_setopt($curlCURLOPT_POSTtrue);
                
    curl_setopt($curlCURLOPT_POSTFIELDS$data);
                
    curl_setopt($curlCURLOPT_HTTPHEADER$headers);
            } else {
                
    curl_setopt($curlCURLOPT_HTTPHEADER$headers);
            }

            
    curl_setopt($curlCURLOPT_SSL_VERIFYPEER0);
            
    curl_setopt($curlCURLOPT_SSL_VERIFYHOST0);
            
    curl_setopt($curlCURLINFO_HEADER_OUTtrue);

            
    $out curl_exec($curl); #Инициируем запрос к API и сохраняем ответ в переменную


            
    $code curl_getinfo($curlCURLINFO_HTTP_CODE); #Получим HTTP-код ответа сервера


            
    curl_close($curl); #Завершаем сеанс cURL

            
    $code = (int)$code;
            
    $errors = array(
                
    301 => 'Moved permanently',
                
    400 => 'Bad request',
                
    401 => 'Unauthorized',
                
    403 => 'Forbidden',
                
    404 => 'Not found',
                
    500 => 'Internal server error',
                
    502 => 'Bad gateway',
                
    503 => 'Service unavailable'
            
    );
            try {
                
    #Если код ответа не равен 200 или 204 - возвращаем сообщение об ошибке
                
    if ($code != 200 && $code != 204 && $code != 201)
                    throw new 
    Exception(isset($errors[$code]) ? $errors[$code] : 'Undescribed error'$code);
            } catch (
    Exception $E) {
                
    print_r($link '<br/>');
                
    print_r($out '<br/>');
                
    print_r($data '<br/>');
                die(
    'Ошибка: ' $E->getMessage() . PHP_EOL 'Код ошибки: ' $E->getCode());
            }

            return 
    $out;
        }
    PHP:
     $res json_decode($this->sendToCRM(json_encode($dataJSON_UNESCAPED_UNICODE), '/API/REST/Workflow/StartProcess'$headers));
     
  5. TheShiroO

    TheShiroO New Member

    У меня проблема в запросе, мне кажется. У меня он такого вида:

    $request = @'
    {
    "Items":
    [
    {
    "Data":null,
    "DataArray":[],
    "Name":"ProcessHeaderId",
    "Value":"3"
    },
    {
    "Data":null,
    "DataArray":[],
    "Name":"ProcessToken",
    "Value":"3"
    },
    {
    "Data":null,
    "DataArray":[],
    "Name":"ProcessName",
    "Value":"Имя"
    },
    {
    "Data":null,
    "DataArray":[],
    "Name":"Context",
    "Value":null
    },
    ],
    "Value":null
    }';
     
  6. alexfuse

    alexfuse Member

    PHP:
      public function RunProcess($res_auth$token$title$variables)
        {

            
    $itemNull json_decode ("null");
            
    $arrayNull = array();

            
    $data = array("Value" => ""); // Объект для формата JSON - запрос на сервер (запуск процесса)
            
    $items = array();             // Список параметров

            // Идентифицируем процесс по GIUD-у, он же токен
            
    $itemProcessToken = array(
                
    "Data" => $itemNull,
                
    "DataArray" => $arrayNull,
                
    "Name" => "ProcessToken",
                
    "Value" => $token);

            
    array_push($items$itemProcessToken);


            
    // Если есть данные для контекста процесса, предаем их
            
    if(count($variables) > 0)
            {
                
    $itemContext = array("Value" => "");
                
    $itemsContext = array(); // Список параметров

                
    for ($i=0;$i<count($variables);$i++) {

                    
    array_push($itemsContext, array(

                        
    "Data" => $itemNull,
                        
    "DataArray" => $arrayNull,
                        
    "Name" => $variables[$i]["Name"],
                        
    "Value" => $variables[$i]["Value"]
                    ));
                }

                
    $itemContext["Items"] = $itemsContext;

                
    $context = array(

                    
    "Data" => $itemContext,
                    
    "DataArray" => $arrayNull,
                    
    "Name" => "Context",
                    
    "Value" => $itemNull
                
    );

                
    array_push($items$context);
            }

            
    // Устанавливаем имя процесса, если оно задано
            
    if(!empty($title)) {
                 
    $itemProcessName = array(

                     
    "Data" => $itemNull,
                     
    "DataArray" => $arrayNull,
                     
    "Name" => "ProcessName",
                     
    "Value" => $title
                 
    );

                
    array_push($items$itemProcessName);
            }

            
    // Закидываем все параметры в запрос
            
    $data["Items"] = $items;

            
    $headers = array(
                
    'Content-Type: application/json;odata=verbose',
                
    'AuthToken: '.$res_auth->{'AuthToken'},
                
    'SessionToken: '.$res_auth->{'SessionToken'},);

            
    //$res = json_encode($data, JSON_UNESCAPED_UNICODE); TODO Вывод запроса
            
    $res json_decode($this->sendToCRM(json_encode($dataJSON_UNESCAPED_UNICODE), '/API/REST/Workflow/StartProcess'$headers));

            return 
    $res;
        }
     

Поделиться: