feat: Content Negotiation vervollständigen — Turtle für alle Endpunkte + Accept-Header (v2.35.0) - #88
Merged
Merged
Conversation
… (v2.35.0) Turtle konnte bisher nur der Katalog liefern, und die Serialisierung liess sich ausschliesslich ueber ?format= waehlen. - /datasets/<id> und /delta liefern jetzt ebenfalls text/turtle. Ein RDF-Harvester muss die Serialisierung nicht mehr je Route wechseln. - Fehlt ?format=, entscheidet der Accept-Header: text/turtle (inkl. der Alt-Bezeichnung application/x-turtle), application/ld+json und application/json. q-Werte nach RFC 9110 werden beruecksichtigt, bei Gleichstand gilt die Client-Reihenfolge, q=0 schliesst einen Typ aus. Wildcards, unbekannte Typen und ein leerer Header fallen auf JSON-LD zurueck (DCAT-AP-Standardfall). - Vary: Accept auf allen Antworten, damit Caches kein Turtle-Dokument an einen JSON-LD-Client ausliefern. Ein explizites ?format= hat weiterhin Vorrang vor dem Header — die URL bleibt eindeutig und kopierbar. Technisch: gemeinsame Helfer resolve_format/negotiate_accept/ serialize_document/document_response; alle drei Endpunkte nutzen denselben Pfad fuer Aushandlung, Serialisierung und Turtle-Caching (bisher nur Katalog). Tests: 7 neue (Media-Types, q-Werte, Gleichstand, q=0, Fallbacks, Vorrang von ?format=, Turtle je Datensatz inkl. Vary). WP_REST_Request-Stub um get_header/set_header ergaenzt. 197 gruen, PHPCS 0, PHPStan clean. Gegenprobe: Einzeldatensatz als Turtle ist valides RDF (rdflib). https://claude.ai/code/session_01JB1xUQM892bVZ4Yv3MZjvq Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JB1xUQM892bVZ4Yv3MZjvq
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Schließt den letzten offenen Punkt der Harvest-Unterstützung. Bisher konnte nur der Katalog Turtle liefern, und die Serialisierung ließ sich ausschließlich über
?format=wählen.1 · Turtle für alle Endpunkte
/datasets/<id>und/deltaliefern jetzt ebenfallstext/turtle. Ein RDF-Harvester muss die Serialisierung damit nicht mehr je Route wechseln.Der Delta-Body ist bereits ein vollständiges JSON-LD-Dokument (
@context,@type: odw:DeltaCatalog,dcat:dataset,odw:removed) — er lässt sich also ohne Sonderbehandlung als Graph serialisieren.2 · Auswertung des
Accept-HeadersFehlt
?format=, entscheidet der Header:text/turtle,application/x-turtleapplication/ld+jsonapplication/json*/*, unbekannt, leerapplication/ld+json;q=0.5, text/turtle;q=0.9→ Turtleq=0schließt einen Typ explizit austext/html,…,*/*;q=0.8) landet korrekt bei JSON-LDEin explizites
?format=hat immer Vorrang vor dem Header — die URL bleibt eindeutig und kopierbar. Der Aliasttlwird weiterhin normalisiert.3 ·
Vary: AcceptAlle Antworten tragen jetzt
Vary: Accept, damit zwischengeschaltete Caches (CDN, Reverse Proxy) kein Turtle-Dokument an einen JSON-LD-Client ausliefern. Ohne diesen Header wäre die Aushandlung in Verbindung mit Caching schlicht falsch.Technisch
Vier gemeinsame Helfer —
resolve_format(),negotiate_accept(),serialize_document(),document_response(). Alle drei Endpunkte nutzen damit denselben Pfad für Aushandlung, Serialisierung und Turtle-Caching; letzteres gab es zuvor nur im Katalog. Die Format-Argumente der Routen sind vereinheitlicht, ein leerer Default bedeutet „nicht angegeben" und aktiviert die Header-Aushandlung.Tests / Qualität
q=0, Fallbacks (inkl. browsertypischem Header), Vorrang von?format=, Turtle-Ausgabe eines Einzeldatensatzes samtVary: Accept.WP_REST_Request-Stub umget_header()/set_header()ergänzt, damit Tests dieselben Zugriffsmethoden nutzen wie der Produktivcode.rdflibgeprüft).Doku
README,
API.mdund CLAUDE.md beschreiben die Aushandlung; die Roadmap führt den Punkt als erledigt. Offen bleibt nur noch RDF/XML als weitere Serialisierung — Turtle und JSON-LD decken die gängigen Harvester ab.🤖 Generated with Claude Code
https://claude.ai/code/session_01JB1xUQM892bVZ4Yv3MZjvq
Generated by Claude Code