Рейтинг:0

Запрос cURL, вызывающий ошибку проверки формы

флаг in

Я работаю над запросом cURL, когда пользователь отправляет существующую форму для отправки некоторых данных внешней службе.

Я добавил эту функцию с помощью этой строки: $form['actions'][$action]['#submit'][] = 'my_module_push_data';

И мои запросы cURL:

    $ch = curl_init();
    // Получить токен доступа здесь
    curl_setopt($ch, CURLOPT_URL, 'https://resturl.com&id=' . $id . '&secret=' . $secret);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    $результат = curl_exec($ch);
    curl_close ($ ч);
    $ результат = json_decode ($ результат, правда);

    // Затем отправляем данные
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, 'https://returl.com/submit.json?access_token=' . $result['access_token']);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($formData));
    curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type:application/json'));
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
    $server_output = curl_exec($ch); // <--- Эта строка вызывает проблемы
    $server_output = json_decode($server_output);

С этим кодом я получаю эту ошибку:

Uncaught PHP Exception LogicException: «Ошибки формы не могут быть установлены после завершения проверки формы». в /mnt/gfs/.../.../docroot/core/lib/Drupal/Core/Form/FormState.php

Я прошел строку за строкой через этот запрос cURL и строку, которую я отметил (вторая curl_exec() вызывает эту ошибку. Если я опускаю эту строку, все работает нормально. Первое curl_exec() работает нормально, и я проверил, что он возвращает токен доступа.

Что я здесь делаю неправильно? Спасибо!

РЕДАКТИРОВАТЬ: Полная функция (запутаны некоторые детали)

/**
 * Пользовательский обработчик отправки для отправки данных в службу
 */
функция my_module_service_signup(массив $form, \Drupal\Core\Form\FormStateInterface $form_state) {
    $vals = $form_state->getValues();
    $formData = [];
    $myVals = [];

    $clientId = Settings::get('service_api_id');
    $clientSecret = Settings::get('service_api_secret');
    $accountId = 'abc123456';
    $formData['unique_id'] = '1234';

    $myVals = [
        'компания' => $vals['field_company'][0]['value'],
        'firstName' => $vals['field_first_name'][0]['value'],
        'lastName' => $vals['field_last_name'][0]['value'],
        ...
    ];

    $formData['input'][0]['fields'] = $myVals;

    пытаться {
        $getClient = \Drupal::httpClient();
        $request = $getClient->post('https://' . $accountId . '.returl.com/get/token?my_id=' . $clientId . '&my_secret=' . $clientSecret);
        $response = json_decode($request->getBody());
    } поймать (RequestException $ e) {
    // LogicException здесь не перехватывается
    }
}

Jaypan avatar
флаг de
Вам нужно показать нам функцию, в которой существует код. Кроме того, Drupal использует HTTP-клиент Guzzle для удаленных запросов, доступ к которому можно получить с помощью `\Drupal::httpClient()`.
флаг in
@Jaypan Я внес изменения с полной функцией (с некоторыми измененными личными данными). Сегодня утром я попытался переключиться на использование `\Drupal::httpClient()`, но выдает ту же ошибку. Кажется, ошибка возникает только тогда, когда он получает успешный ответ от конечной точки. Я могу видеть тело ответа в сторожевом таймере, но оно продолжает выдавать это исключение.
Jaypan avatar
флаг de
Вы уверены, что именно отсюда исходит ваша ошибка? Что произойдет, если вы удалите запрос вообще только для тестирования?
флаг in
@Jaypan Все работает нормально, если запрос удален. В сторожевом таймере не регистрируется никаких ошибок, создается учетная запись пользователя, и пользователь перенаправляется на серверную часть сайта. Простое закомментирование строки $getClient->post() решает проблему.
Jaypan avatar
флаг de
Попробуйте перехватить `\Exception`, а затем использовать `watchdog_exception()` (https://api.drupal.org/api/drupal/core%21includes%21bootstrap.inc/function/watchdog_exception/9.2.x), чтобы зарегистрировать результат. Может быть, вы можете получить больше информации от этого.

Ответить или комментировать

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