Điểm:0

yêu cầu cURL gây ra lỗi xác thực biểu mẫu

lá cờ in

Tôi đang xử lý yêu cầu cURL khi người dùng gửi biểu mẫu hiện có để gửi một số dữ liệu đến dịch vụ bên ngoài.

Tôi đã thêm chức năng này với dòng này: $form['actions'][$action]['#submit'][] = 'my_module_push_data';

Và các yêu cầu cURL của tôi:

    $ch = curl_init();
    // Nhận mã thông báo truy cập tại đây
    curl_setopt($ch, CURLOPT_URL, 'https://resturl.com&id=' . $id . '&secret=' . $secret);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    $result = curl_exec($ch);
    curl_close($ch);
    $result = json_decode($result, true);

    // Sau đó gửi dữ liệu
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, 'https://resturl.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('Kiểu nội dung:application/json'));
    curl_setopt($ch, CURLOPT_RETURNTTRASFER, TRUE);
    $server_output = curl_exec($ch); // <--- Dòng này gây ra vấn đề
    $server_output = json_decode($server_output);

Với mã này, tôi gặp lỗi này:

Uncaught PHP Ngoại lệ LogicException: "Không thể đặt lỗi biểu mẫu sau khi xác thực biểu mẫu kết thúc." tại /mnt/gfs/.../.../docroot/core/lib/Drupal/Core/Form/FormState.php

Tôi đã đi từng dòng qua yêu cầu cURL này và dòng tôi đã đánh dấu (thứ hai curl_exec() gây ra lỗi này. Nếu tôi bỏ qua dòng đó thì nó hoạt động tốt. đầu tiên curl_exec() hoạt động tốt và tôi đã xác minh rằng nó đang trả lại mã thông báo truy cập.

Tôi làm gì sai ở đây? Cảm ơn bạn!

CHỈNH SỬA: Chức năng đầy đủ (làm rối một số chi tiết)

/**
 * Trình xử lý gửi tùy chỉnh để đẩy dữ liệu vào Dịch vụ
 */
function my_module_service_signup(array $form, \Drupal\Core\Form\FormStateInterface $form_state) {
    $vals = $form_state->getValues();
    $formData = [];
    $myVals = [];

    $clientId = Cài đặt::get('service_api_id');
    $clientSecret = Cài đặt::get('service_api_secret');
    $accountId = 'abc123456';
    $formData['unique_id'] = '1234';

    $myVals = [
        'công ty' => $vals['field_company'][0]['value'],
        'firstName' => $vals['field_first_name'][0]['value'],
        'lastName' => $vals['field_last_name'][0]['value'],
        ...
    ];

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

    cố gắng {
        $getClient = \Drupal::httpClient();
        $request = $getClient->post('https://' . $accountId . '.resturl.com/get/token?my_id=' . $clientId . '&my_secret=' . $clientSecret);
        $response = json_decode($request->getBody());
    } bắt(RequestException $e) {
    // LogicException không bị bắt ở đây
    }
}

Jaypan avatar
lá cờ de
Bạn cần chỉ cho chúng tôi chức năng chứa mã. Ngoài ra, Drupal sử dụng ứng dụng khách Guzzle HTTP cho các yêu cầu từ xa, có thể được truy cập bằng `\Drupal::httpClient()`.
lá cờ in
@Jaypan Tôi đã thực hiện chỉnh sửa với đầy đủ chức năng (có thay đổi một số chi tiết riêng tư). Tôi đã thử chuyển sang sử dụng `\Drupal::httpClient()` sáng nay và nó cũng báo lỗi tương tự. Nó dường như chỉ đưa ra lỗi khi nhận được phản hồi thành công từ điểm cuối. Tôi có thể thấy nội dung phản hồi trong cơ quan giám sát nhưng nó vẫn tiếp tục đưa ra ngoại lệ này.
Jaypan avatar
lá cờ de
Bạn có chắc đó là lỗi của bạn đến từ đâu không? Điều gì xảy ra nếu bạn xóa hoàn toàn yêu cầu chỉ để thử nghiệm?
lá cờ in
@Jaypan Mọi thứ hoạt động tốt nếu yêu cầu bị xóa. Không có lỗi đăng nhập vào cơ quan giám sát, tài khoản người dùng được tạo và người dùng được chuyển hướng đến phần phụ trợ của trang web. Chỉ cần bình luận dòng `$getClient->post()` sẽ giải quyết được sự cố.
Jaypan avatar
lá cờ de
Hãy thử bắt `\Exception`, sau đó sử dụng `watchdog_Exception()` (https://api.drupal.org/api/drupal/core%21includes%21bootstrap.inc/function/watchdog_exception/9.2.x) để ghi lại kết quả. Có lẽ bạn có thể nhận được thêm thông tin từ đó.

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.