Puncte:0

Migrarea unui API Rest personalizat folosind PATCH/POST

drapel lb

Am avut un API REST personalizat care funcționează perfect cu Drupal 8. După actualizarea la Drupal 9.2.X, sistemul Plasture și Post metodele acestui API REST personalizat nu mai funcționează. Acum ei aruncă următoarea excepție.

RuntimeException: apelabil „Drupal\my_module\Plugin\rest\resource\UpdateBoxes::patch” necesită o valoare pentru argumentul „$payload”. în Drupal\Component\Utility\ArgumentsResolver->handleUnresolvedArgument() (linia 143 din /var/www/docroot/core/lib/Drupal/Component/Utility/ArgumentsResolver.php).

Codul pe care îl folosesc este următorul.

spațiu de nume Drupal\modulul_meu\Plugin\rest\resursa;

utilizați Drupal\rest\ModifiedResourceResponse;

/**
 * Oferă o resursă pentru a obține moduri de vizualizare în funcție de entitate și pachet.
 *
 * @RestResource(
 * id = "update_boxes",
 * etichetă = @Translation(„Casutele de actualizare”),
 * uri_paths = {
 * „canonic” = „/api/container/{container_id}/{type}/{product_id}/boxes”
 *}
 * )
 */
clasa UpdateBoxes extinde ResourceBase {

  /**
   * O instanță de utilizator actuală.
   *
   * @var \Drupal\Core\Session\AccountProxyInterface
   */
  protejat $currentUser;

  protejat $boxesHandler;

  protejat $event_dispacher;

  /**
   * {@inheritdoc}
   */
  funcția publică statică create(ContainerInterface $container, matrice $configurație, $plugin_id, $plugin_definition) {
    $instanta = parent::create($container, $configuration, $plugin_id, $plugin_definition);
    $instance->currentUser = $container->get('current_user');
    $instanta->boxesHandler = $container->get('boxes.handler');
    $instanță->event_dispacher = $container->get('event_dispatcher');

    returnare $instanță;
  }

  /**
   * Răspunde la solicitările PATCH.
   *
   * @param $container_id
   * @param $type
   * @param $product_id
   * @param $sarcină utilă
   * @return \Drupal\rest\ModifiedResourceResponse
   * Obiectul răspuns HTTP.
   */
    patch-ul funcției publice ($container_id = null, $tip = null, $product_id = null, $payload) {
      //Codul meu aici.
     
    }

}

În plasture() puteam citi $sarcină utilă și vedeți matricea trimisă în cerere, dar după actualizarea site-ului, $sarcină utilă este NUL.

Soluția pe care am găsit-o a fost schimbarea ultimului argument al plasture() și extrageți sarcina utilă din $cerere obiect.

patch-ul funcției publice($container_id = null, $tip = null, $product_id = null, Solicitare $request) {
  // â¦
  $payload = json_decode($request->getContent(), TRUE);
}

Nu am găsit nicio documentație despre această modificare; Nu sunt sigur că a fost o practică bună sau o implementare mai bună pentru ca sarcina utilă să funcționeze.

Puncte:1
drapel cn

Am aceeasi problema cu a obține metodă. Se pare că are legătură cu conversia parametrilor (vezi problemă raportată). Am reușit să rezolv problema utilizând nume simple ale parametrilor, de exemplu, să elimin toate caracterele de subliniere din comentarii și numele parametrilor metodei:

"canonic" = "/api/container/{containerid}/{tip}/{productid}/boxes"

Si in metoda:

patch de funcție publică ($containerid = null, $tip = null, $productid = null, Solicitare $cerere) {
mogio avatar
drapel cn
Mulțumiri. Asta a funcționat. Acesta ar trebui marcat ca „răspunsul”. Am eliminat liniuțele de subliniere din parametru și am redenumit numele paramului canonic la denumirea exactă a $var a funcției get. :) Mai interesant este faptul că a funcționat în Drupal 8 :)

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.