it-swarm.com.de

Drupal 8 speichert Rest-API-Aufrufe zwischen

Ich verwende Drupal 8 im Headless-Modus mit angular 8 als Client. Das Problem, mit dem ich konfrontiert bin, ist, dass Drupal die Aufrufe an die Apis zwischenspeichert. Zum Beispiel habe ich einen Endpunkt, der davon ausgeht, dass Elemente in zufälliger Reihenfolge angegeben werden. Dies geschieht jedoch nicht. Ich erhalte nur Cache-Elemente in einer bestimmten Reihenfolge. Wie kann ich das überwinden? Ich habe versucht, Cache-Module zu deaktivieren, erhalte aber immer noch das gleiche Verhalten

7
user1648228

In Drupal gibt es zwei Ebenen des Caching.

1.) Dynamischer Seiten-Cache

Sie müssen die richtigen Cache-Metadaten für die JSON-Antwort angeben.

Verwenden Sie beispielsweise die Cache-Eigenschaften einer Konfigurations- oder Inhaltsentität

$response->addCacheableDependency($entitiy);

oder erstellen Sie ein zwischenspeicherbares Metadatenobjekt und fügen Sie dies der Antwort hinzu:

$build = [
  '#cache' => [
    'contexts' => ['url.query_args'],
    'tags' => ['node:1', 'node_list'],
    'max-age' => 300,
  ],
];
$cache_metadata = \Drupal\Core\Cache\CacheableMetadata::createFromRenderArray($build);
$response->addCacheableDependency($cache_metadata);

Sie können dies in einem benutzerdefinierten Controller verwenden oder in einem Ereignisabonnenten implementieren, um Antworten von anderen Modulen (Core oder Contrib) zu ändern.

2.) Interner Seiten-Cache

Das Modul Interner Seiten-Cache speichert alle Antworten für anonyme Anforderungen unabhängig von den Cache-Metadaten zwischen. Sie können dieses Modul deinstallieren, um diesen Cache zu deaktivieren.

Alternative Lösung

Fügen Sie auf der Clientseite jeder Anforderung eine andere Abfragezeichenfolge hinzu, um eine neue Antwort zu erhalten:

node/123?_format=json&time=123456789

Dadurch werden der Interner Seiten-Cache und Teile des Dynamischen Seiten-Cache deaktiviert.

Referenz: https://www.drupal.org/docs/8/core/modules/rest/javascript-and-drupal-8-restful-web-services

12
4k4

Ich ziehe es vor, den Cache für meine Endpunkte vollständig zu deaktivieren. Sie können dies tun, indem Sie dem Objekt ResourceResponse eine zwischenspeicherbare Abhängigkeit mit einem MaxAge von Null hinzufügen.

Hier ist ein Beispiel:

$response = new ResourceResponse($data);
$disable_cache = new CacheableMetadata();
$disable_cache->setCacheMaxAge(0);

$response->addCacheableDependency($disable_cache);

return $response;
5
Juanmi