Puncte:1

Efectuarea unei subcereri HTTP face ca CurrentRouteMatch să aibă o rută greșită

drapel by

Din motive complicate și neplăcute[*], vreau să încorporez datele de entitate din modulul JSONAPI în interiorul JSON returnat dintr-o resursă de modul REST.

Încerc să fac acest lucru făcând o subcerere HTTP către ruta modulului JSONAPI din clasa de resurse a modulului REST.

Ca aceasta:

    $kernel = \Drupal::service('http_kernel');

    $cerere_curente = \Drupal::cerere();

    $request = Request::create('/jsonapi/paragraph/' . $paragraph->bundle() . '/' . $paragraph->uuid->value);
    $request->setSession($current_request->getSession());

    $răspuns = $kernel->handle($cerere, HttpKernelInterface::SUB_REQUEST);
    $json = $răspuns->getContent();
    $date = json_decode($json, TRUE);

Primesc datele pe care le doresc și sunt grozav!

Cu toate acestea, cererea principală către punctul final al resursei REST se blochează cu aceasta:

Symfony\Component\Serializer\Exception\NotEncodableValueException: Serializarea pentru formatul „api_json” nu este acceptată. în Symfony\Component\Serializer\Serializer->serialize() (linia 112 din /var/www/vendor/symfony/serializer/Serializer.php).

Acest lucru se datorează faptului că în Drupal\rest\EventSubscriber\ResourceResponseSubscriber->getResponseFormat(), $route = $route_match->getRouteObject(); este ruta modulului JSONAPI de la subcerere și nu ruta de la cererea principală.

Ce greșesc cu cererea mea secundară?

[*] O cantitate enormă de cod personalizat care alimentează o resursă REST pentru un front end decuplat. Vreau să-l schimb folosind JSONAPI, dar este o schimbare masivă cu repercusiuni uriașe pe front-end. Pentru a trece treptat la JSONAPI, vreau să schimb unele tipuri de paragraf la formatul JSONAPI. Ar putea apela direct codul PHP al modulului JSONAPI, dar asta este nu este un API public și astfel versiunile viitoare ale Drupal l-ar putea rupe. Efectuarea unei subcereri înseamnă utilizarea API-ului și, prin urmare, mai ușor de întreținut.

Jaypan avatar
drapel de
De ce faci o subcerere și nu folosești clientul HTTP Guzzle pentru a-ți face cererea?
drapel by
Cineva mi-a sugerat să folosesc o subcerere Symfony în Slack. Un client HTTP Guzzle nu va însemna o cerere separată efectivă către server? Sunt O MULTE de entități de paragraf implicate, așa că adăugarea de solicitări HTTP reale ar fi probabil dăunătoare pentru performanță.
drapel by
Întrebare actualizată pentru a explica mai clar că vreau să pun datele JSON dintr-unul în celălalt.
Puncte:2
drapel cn

După rularea cererii secundare, stiva de cereri este destul de dezamăgitoare, conține încă subcererea în timp ce stiva de potrivire a rutei a fost curățată. Dacă apoi obțineți potrivirea curentă a rutei, aceasta va returna o potrivire a rutei nou creată pe baza solicitării API json.

O soluție rapidă ar fi curățarea manuală a stivei de solicitări, inclusiv o verificare, astfel încât codul să funcționeze în continuare atunci când problema principală este remediată:

$cerere_curente = \Drupal::cerere();

$request = Request::create('/jsonapi/node/page/UUID', 'GET', [], $current_request->cookies->all(), [], $current_request->server->all() );
$request->setSession($current_request->getSession());


$răspuns = $kernel->handle($cerere, HttpKernelInterface::SUB_REQUEST);
if (\Drupal::request()->getPathInfo() !== $current_request->getPathInfo()) {
  \Drupal::requestStack()->pop();
}

BTW, subcererea dvs. probabil are nevoie de mai multe metadate din cererea principală. Am adăugat module cookie și anteturi de server la exemplul de cod.

drapel by
Exact asta a fost -- potrivirea traseului subcererii polua lucrurile. Este o eroare de bază și există o problemă pentru ea? Am totul de lucru acum, mulțumesc!! :)
drapel by
Nu s-a putut găsi o problemă existentă, depusă pe https://www.drupal.org/project/drupal/issues/3218022.
Puncte:1
drapel by

De atunci am descoperit că modulul jsonapi_extras oferă exact aceeași funcționalitate - obținerea reprezentării JSONAPI a unei entități prin efectuarea unei subcereri. Acest lucru pare să evite problema prin utilizarea http_kernel.basic serviciu pentru a face subcererea. Se pare că asta nu păstrează o stivă de cereri, așa că ocolește problema ținerii evidenței cererilor multiple?

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.