Score: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);
    $result = curl_exec($ch);
    curl_close($ch);
    $result = json_decode($result, จริง);

    // จากนั้นส่งข้อมูล
    $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('Content-Type:application/json'));
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, จริง);
    $server_output = curl_exec($ch); // <--- บรรทัดนี้ทำให้เกิดปัญหา
    $server_output = json_decode($server_output);

ด้วยรหัสนี้ ฉันได้รับข้อผิดพลาดนี้:

Uncaught ข้อยกเว้น PHP 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 = การตั้งค่า::get('service_api_id');
    $clientSecret = การตั้งค่า::get('service_api_secret');
    $accountId = 'abc123456';
    $formData['unique_id'] = '1234';

    $myVals = [
        'company' => $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 . '.resturl.com/get/token?my_id=' . $clientId . '&my_secret=' . $clientSecret);
        $response = json_decode($request->getBody());
    } จับ (RequestException $e) {
    // ไม่พบ LogicException ที่นี่
    }
}

Jaypan avatar
de flag
คุณต้องแสดงฟังก์ชันที่มีรหัสอยู่ นอกจากนี้ Drupal ยังใช้ไคลเอนต์ Guzzle HTTP สำหรับคำขอระยะไกล ซึ่งสามารถเข้าถึงได้ด้วย `\Drupal::httpClient()`
in flag
@Jaypan ฉันได้ทำการแก้ไขด้วยฟังก์ชั่นเต็มรูปแบบ (โดยมีการเปลี่ยนแปลงรายละเอียดส่วนตัวบางส่วน) ฉันลองเปลี่ยนไปใช้ `\Drupal::httpClient()` เมื่อเช้านี้ และเกิดข้อผิดพลาดเดียวกัน ดูเหมือนว่าจะส่งข้อผิดพลาดเมื่อได้รับการตอบกลับที่สำเร็จจากจุดสิ้นสุดเท่านั้น ฉันสามารถดูเนื้อหาการตอบสนองใน watchdog ได้ แต่ยังคงส่งข้อยกเว้นนี้ต่อไป
Jaypan avatar
de flag
คุณแน่ใจหรือว่าข้อผิดพลาดของคุณมาจากไหน จะเกิดอะไรขึ้นหากคุณลบคำขอทั้งหมดเพื่อการทดสอบ
in flag
@Jaypan ทุกอย่างทำงานได้ดีหากคำขอถูกลบ ไม่มีข้อผิดพลาดในการเข้าสู่ระบบ watchdog บัญชีผู้ใช้จะถูกสร้างขึ้น และผู้ใช้จะถูกเปลี่ยนเส้นทางไปยังส่วนหลังของไซต์ เพียงแสดงความคิดเห็นในบรรทัดที่มี `$getClient->post()` จะช่วยแก้ปัญหาได้
Jaypan avatar
de flag
ลองจับ `\Exception` จากนั้นใช้ `watchdog_exception()` (https://api.drupal.org/api/drupal/core%21includes%21bootstrap.inc/function/watchdog_exception/9.2.x) เพื่อบันทึกผลลัพธ์ บางทีคุณอาจได้รับข้อมูลเพิ่มเติมจากสิ่งนั้น

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา