Score:0

การโยกย้าย Rest API แบบกำหนดเองโดยใช้ PATCH/POST

ธง lb

ฉันมี REST API แบบกำหนดเองที่ทำงานร่วมกับ Drupal 8 ได้อย่างสมบูรณ์แบบ หลังจากอัปเกรดเป็น Drupal 9.2.X แล้ว ปะ และ โพสต์ วิธีการของ REST API ที่กำหนดเองนี้หยุดทำงาน ตอนนี้พวกเขาส่งข้อยกเว้นต่อไปนี้

RuntimeException: "Drupal\my_module\Plugin\rest\resource\UpdateBoxes::patch" ที่เรียกได้ต้องใช้ค่าสำหรับอาร์กิวเมนต์ "$payload" ใน Drupal\Component\Utility\ArgumentsResolver->handleUnresolvedArgument() (บรรทัดที่ 143 ของ /var/www/docroot/core/lib/Drupal/Component/Utility/ArgumentsResolver.php)

รหัสที่ฉันใช้คือรหัสต่อไปนี้

เนมสเปซ Drupal\my_module\Plugin\rest\resource;

ใช้ Drupal\rest\ModifiedResourceResponse;

/**
 * จัดเตรียมทรัพยากรเพื่อรับโหมดการดูตามเอนทิตีและบันเดิล
 *
 * @เรสท์รีซอร์ส(
 * id = "update_boxes",
 * label = @Translation("กล่องอัพเดท"),
 * uri_paths = {
 * "canonical" = "/api/container/{container_id}/{type}/{product_id}/boxes"
 * }
 * )
 */
คลาส UpdateBoxes ขยาย ResourceBase {

  /**
   * ตัวอย่างผู้ใช้ปัจจุบัน
   *
   * @var \Drupal\Core\Session\AccountProxyInterface
   */
  ป้องกัน $currentUser;

  ป้องกัน $boxesHandler;

  ป้องกัน $event_dispacher;

  /**
   * {@inheritdoc}
   */
  การสร้างฟังก์ชันสแตติกสาธารณะ (ContainerInterface $container, อาร์เรย์ $configuration, $plugin_id, $plugin_definition) {
    $instance = parent::create($container, $configuration, $plugin_id, $plugin_definition);
    $instance->currentUser = $container->get('current_user');
    $instance->boxesHandler = $container->get('boxes.handler');
    $instance->event_dispacher = $container->get('event_dispatcher');

    ส่งคืนอินสแตนซ์ $;
  }

  /**
   * ตอบสนองต่อคำขอ PATCH
   *
   * @param $container_id
   * @param $ประเภท
   * @param $product_id
   * @param $เพย์โหลด
   * @return \Drupal\rest\ModifiedResourceResponse
   * วัตถุตอบสนอง HTTP
   */
    แพตช์ฟังก์ชันสาธารณะ ($container_id = null, $type = null, $product_id = null, $payload) {
      // รหัสของฉันที่นี่
     
    }

}

ใน ปะ() ฉันสามารถอ่าน $น้ำหนักบรรทุก และดูอาร์เรย์ที่ส่งในคำขอ แต่หลังจากอัปเกรดไซต์แล้ว $น้ำหนักบรรทุก เป็น โมฆะ.

วิธีแก้ปัญหาที่ฉันพบคือการเปลี่ยนอาร์กิวเมนต์สุดท้ายของ ปะ() และแยกส่วนของข้อมูลออกจาก คำขอ $ วัตถุ.

แพตช์ฟังก์ชันสาธารณะ ($container_id = null, $type = null, $product_id = null, คำขอ $request) {
  // â¦
  $payload = json_decode($request->getContent(), จริง);
}

ฉันไม่พบเอกสารใดๆ เกี่ยวกับการเปลี่ยนแปลงนี้ ฉันไม่แน่ใจว่ามันเป็นแนวทางปฏิบัติที่ดีหรือการใช้งานที่ดีกว่าเพื่อให้เพย์โหลดทำงานได้

Score:1
ธง cn

ฉันมีปัญหาเดียวกันกับ a รับ กระบวนการ. ดูเหมือนว่าจะเกี่ยวข้องกับการแปลงพารามิเตอร์ (ดู รายงานปัญหา). ฉันสามารถแก้ไขปัญหาได้โดยใช้ชื่อพารามิเตอร์อย่างง่าย ตัวอย่างเช่น ลบเครื่องหมายขีดล่างทั้งหมดในความคิดเห็นและชื่อพารามิเตอร์เมธอด:

"canonical" = "/api/container/{containerid}/{type}/{productid}/boxes"

และในวิธีการ:

แพตช์ฟังก์ชันสาธารณะ ($containerid = null, $type = null, $productid = null, คำขอ $request) {
mogio avatar
cn flag
ขอบคุณ. นั่นได้ผล สิ่งนี้ควรทำเครื่องหมายว่าเป็น "คำตอบ" ฉันลบเครื่องหมายขีดล่างออกจากพารามิเตอร์และเปลี่ยนชื่อ Canonical param เป็นชื่อที่ถูกต้องของ $var ของฟังก์ชัน get :) ที่น่าสนใจกว่าคือความจริงที่ว่ามันทำงานใน Drupal 8 :)

โพสต์คำตอบ

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