{"id":662,"date":"2026-05-02T22:49:39","date_gmt":"2026-05-02T21:49:39","guid":{"rendered":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/?p=662"},"modified":"2026-06-16T22:54:01","modified_gmt":"2026-06-16T21:54:01","slug":"spring-cloud-gateway-api-gateway-pattern-mit-spring","status":"publish","type":"post","link":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/?p=662","title":{"rendered":"Spring Cloud Gateway \u2013 API-Gateway-Pattern mit Spring"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">In Microservice-Architekturen sitzt vor jedem Dienst eine eigene API, jeder Dienst hat eine eigene URL und eigene Authentifizierung \u2013 f\u00fcr Clients eine Zumutung. Ein API-Gateway fasst alle Dienste unter einer zentralen URL zusammen, leitet Requests weiter und \u00fcbernimmt Querschnittsaufgaben wie Authentifizierung, Rate Limiting und Logging. Spring Cloud Gateway ist der reaktive, auf WebFlux basierende Gateway-Baustein des Spring-\u00d6kosystems.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Warum ein API-Gateway?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Ohne Gateway kommuniziert jeder Client direkt mit jedem Microservice \u2013 ein Albtraum bei wachsender Dienstanzahl:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>CORS-Konfiguration pro Dienst<\/li>\n\n\n\n<li>Authentifizierung muss jeder Dienst einzeln implementieren<\/li>\n\n\n\n<li>Client muss alle Service-URLs kennen<\/li>\n\n\n\n<li>Kein zentrales Rate Limiting oder Load Balancing<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Mit einem Gateway laufen alle Client-Requests \u00fcber eine zentrale Adresse&nbsp;<code>https:\/\/api.meineapp.de<\/code>. Das Gateway routet dann basierend auf dem Pfad an den richtigen Backend-Dienst.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Abh\u00e4ngigkeit und erste Route<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Spring Cloud Gateway wird als normale Spring Boot Starter-Abh\u00e4ngigkeit eingebunden. Ab Spring Cloud Gateway 5.x (Spring Boot 4.x) gibt es zwei Varianten: die reaktive WebFlux-Variante und eine servlet-basierte Web-MVC-Variante.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Reaktive Variante (WebFlux):<\/strong><\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dependency<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId<\/span>&gt;<\/span>org.springframework.cloud<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">groupId<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId<\/span>&gt;<\/span>spring-cloud-starter-gateway-server-webflux<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">artifactId<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">dependency<\/span>&gt;<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\"><strong>Servlet-Variante (Web MVC):<\/strong><\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dependency<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId<\/span>&gt;<\/span>org.springframework.cloud<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">groupId<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId<\/span>&gt;<\/span>spring-cloud-starter-gateway-server-webmvc<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">artifactId<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">dependency<\/span>&gt;<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Die WebFlux-Variante ist der etablierte Standard und wird in diesem Artikel verwendet. Die MVC-Variante eignet sich f\u00fcr Projekte, die bewusst auf das Servlet-Modell setzen und keine reaktive Programmierung ben\u00f6tigen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Eine Route in&nbsp;<code>application.yml<\/code>:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">spring:\n  cloud:\n    gateway:\n      routes:\n        - id: bestell-service\n          <span class=\"hljs-attr\">uri<\/span>: http:<span class=\"hljs-comment\">\/\/localhost:8081<\/span>\n          predicates:\n            - Path=<span class=\"hljs-regexp\">\/api\/<\/span>bestellungen<span class=\"hljs-comment\">\/**\n          filters:\n            - StripPrefix=1\n<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Requests an&nbsp;<code>GET \/api\/bestellungen\/42<\/code>&nbsp;werden an&nbsp;<code>http:\/\/localhost:8081\/bestellungen\/42<\/code>&nbsp;weitergeleitet.&nbsp;<code>StripPrefix=1<\/code>&nbsp;entfernt das erste Pfadsegment (<code>\/api<\/code>).<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Route-Predicates<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Predicates bestimmen, ob eine Route auf einen Request zutrifft. Die h\u00e4ufigsten sind:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">- id: user-service\n  <span class=\"hljs-attr\">uri<\/span>: http:<span class=\"hljs-comment\">\/\/localhost:8082<\/span>\n  predicates:\n    - Path=<span class=\"hljs-regexp\">\/api\/u<\/span>sers<span class=\"hljs-comment\">\/**\n    - Method=GET,POST\n    - Header=X-Version, v2\n    - Query=debug, true\n    - Cookie=session, .*\n    - Host=api.meineapp.de\n<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Nur wenn alle Predicates zutreffen, wird die Route aktiv. Beliebige Kombinationen sind m\u00f6glich.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Gateway-Filter<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Filter modifizieren eingehende Requests oder ausgehende Responses. Spring Cloud Gateway unterscheidet&nbsp;<strong>Pre-Filter<\/strong>&nbsp;(vor dem Routing) und&nbsp;<strong>Post-Filter<\/strong>&nbsp;(nach der Backend-Antwort).<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Request-Header modifizieren<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">filters:\n  - AddRequestHeader=X-Gateway, <span class=\"hljs-literal\">true<\/span>\n  - RemoveRequestHeader=Cookie\n  - SetRequestHeader=X-Api-Key, ${API_KEY}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Rate Limiting mit Redis<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">- id: rate-limited-service\n  <span class=\"hljs-attr\">uri<\/span>: http:<span class=\"hljs-comment\">\/\/localhost:8081<\/span>\n  predicates:\n    - Path=<span class=\"hljs-regexp\">\/api\/<\/span>limit<span class=\"hljs-comment\">\/**\n  filters:\n    - name: RequestRateLimiter\n      args:\n        redis-rate-limiter.replenishRate: 10\n        redis-rate-limiter.burstCapacity: 20\n        key-resolver: \"#{<span class=\"hljs-doctag\">@ipKeyResolver<\/span>}\"\n<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Dazu ein KeyResolver-Bean, das den Client anhand der IP identifiziert:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-keyword\">@Bean<\/span>\nKeyResolver ipKeyResolver() {\n    <span class=\"hljs-selector-tag\">return<\/span> <span class=\"hljs-selector-tag\">exchange<\/span> <span class=\"hljs-selector-tag\">-<\/span>&gt; <span class=\"hljs-selector-tag\">Mono<\/span><span class=\"hljs-selector-class\">.just<\/span>(\n        <span class=\"hljs-selector-tag\">exchange<\/span><span class=\"hljs-selector-class\">.getRequest<\/span>()<span class=\"hljs-selector-class\">.getRemoteAddress<\/span>()\n            <span class=\"hljs-selector-class\">.getAddress<\/span>()<span class=\"hljs-selector-class\">.getHostAddress<\/span>());\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">10 Requests pro Sekunde (replenishRate) mit einer Burst-Toleranz von 20. Redis wird als Backend f\u00fcr den Token-Bucket-Algorithmus ben\u00f6tigt.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Circuit Breaker mit Resilience4j<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-8\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">filters:\n  - name: CircuitBreaker\n    <span class=\"hljs-attr\">args<\/span>:\n      name: backendA\n      <span class=\"hljs-attr\">fallbackUri<\/span>: forward:<span class=\"hljs-regexp\">\/fallback\/<\/span>backendA\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-8\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Wenn der Backend-Dienst nicht erreichbar ist, wird der Circuit ge\u00f6ffnet und eine konfigurierte Fallback-Route aktiv \u2013 ohne dass der Client eine Fehlermeldung sieht.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Dynamisches Routing mit Discovery Service<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">In Kombination mit einem Service-Registry (Eureka, Consul) kann das Gateway Dienste automatisch entdecken:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-9\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">spring:\n  cloud:\n    gateway:\n      discovery:\n        locator:\n          enabled: <span class=\"hljs-literal\">true<\/span>\n          lower-<span class=\"hljs-keyword\">case<\/span>-service-id: <span class=\"hljs-literal\">true<\/span>\n      <span class=\"hljs-attr\">routes<\/span>:\n        - id: dynamic-bestell\n          <span class=\"hljs-attr\">uri<\/span>: lb:<span class=\"hljs-comment\">\/\/BESTELL-SERVICE<\/span>\n          predicates:\n            - Path=<span class=\"hljs-regexp\">\/api\/<\/span>bestellungen<span class=\"hljs-comment\">\/**\n<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-9\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\"><code>lb:\/\/<\/code>&nbsp;aktiviert clientseitiges Load Balancing \u00fcber mehrere Instanzen des Dienstes. F\u00e4llt eine Instanz aus, verteilt das Gateway automatisch auf die verbleibenden.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Eigenen Gateway-Filter programmieren<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Neben den eingebauten Filtern lassen sich eigene Filter schreiben:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-10\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">@Component\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">TimingFilter<\/span> <span class=\"hljs-keyword\">implements<\/span> <span class=\"hljs-title\">GlobalFilter<\/span> <\/span>{\n\n    @Override\n    <span class=\"hljs-keyword\">public<\/span> Mono&lt;Void&gt; filter(ServerWebExchange exchange,\n                             GatewayFilterChain chain) {\n        long start = System.currentTimeMillis();\n        <span class=\"hljs-keyword\">return<\/span> chain.filter(exchange)\n            .doFinally(signalType -&gt; {\n                long dauer = System.currentTimeMillis() - start;\n                log.info(<span class=\"hljs-string\">\"Request {} dauerte {} ms\"<\/span>,\n                    exchange.getRequest().getPath(), dauer);\n            });\n    }\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-10\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Globale Filter werden auf jede Route angewandt \u2013 ideal f\u00fcr Logging, Tracing oder benutzerdefinierte Sicherheitschecks.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Gateway-Filter in der MVC-Variante<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Wer die Web-MVC-Variante nutzt, programmiert Filter nicht als&nbsp;<code>GlobalFilter<\/code>, sondern als&nbsp;<code>HandlerFilterFunction<\/code>. Die Konfiguration erfolgt \u00fcber eine funktionale Router-API:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-11\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">import<\/span> <span class=\"hljs-keyword\">static<\/span> org.springframework.cloud.gateway.server.mvc.handler.GatewayRouterFunctions.route;\n<span class=\"hljs-keyword\">import<\/span> <span class=\"hljs-keyword\">static<\/span> org.springframework.cloud.gateway.server.mvc.filter.BeforeFilterFunctions.*;\n\n@Bean\npublic RouterFunction&lt;ServerResponse&gt; customRoutes() {\n    <span class=\"hljs-keyword\">return<\/span> route(<span class=\"hljs-string\">\"bestell-service\"<\/span>)\n        .GET(<span class=\"hljs-string\">\"\/api\/bestellungen\/**\"<\/span>, http())\n        .before(uri(<span class=\"hljs-string\">\"http:\/\/localhost:8081\"<\/span>))\n        .before(rewritePath(<span class=\"hljs-string\">\"\/api\/(?&lt;segment&gt;.*)\"<\/span>, <span class=\"hljs-string\">\"\/${segment}\"<\/span>))\n        .build();\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-11\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Die MVC-Variante verzichtet auf reaktive Typen wie&nbsp;<code>Mono<\/code>&nbsp;und&nbsp;<code>Flux<\/code>&nbsp;und nutzt stattdessen die vertraute Servlet-API. YAML-Konfiguration funktioniert in beiden Varianten identisch.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Sicherheit mit Spring Security<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Das Gateway ist der nat\u00fcrliche Ort f\u00fcr Authentifizierung. Mit Spring Security und OAuth2:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-12\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">spring:\n  security:\n    oauth2:\n      resourceserver:\n        jwt:\n          issuer-uri: https:<span class=\"hljs-comment\">\/\/auth.meineapp.de<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-12\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Jeder eingehende Request wird auf ein g\u00fcltiges JWT gepr\u00fcft, bevor er \u00fcberhaupt das Backend erreicht. Die Microservices dahinter k\u00f6nnen sich auf andere Aufgaben konzentrieren.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Fazit<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Spring Cloud Gateway ist der zentrale Eingangspunkt f\u00fcr moderne Microservice-Landschaften. Es routet Requests anhand flexibler Predicates, modifiziert sie \u00fcber Filter und \u00fcbernimmt Querschnittsaufgaben wie Rate Limiting, Circuit Breaking und Authentifizierung zentral. Die reaktive Basis auf WebFlux garantiert hohen Durchsatz, die nahtlose Integration mit Service Discovery reduziert Konfigurationsaufwand. Seit Version 5.x steht mit der Web-MVC-Variante auch eine servlet-basierte Alternative zur Verf\u00fcgung \u2013 ideal f\u00fcr Teams, die nicht vollst\u00e4ndig auf reaktive Programmierung umsteigen m\u00f6chten. Wer Spring Boot im Backend einsetzt, findet im Gateway den passenden Eintrittspunkt.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In Microservice-Architekturen sitzt vor jedem Dienst eine eigene API, jeder Dienst hat eine eigene URL und eigene Authentifizierung \u2013 f\u00fcr Clients eine Zumutung. Ein API-Gateway fasst alle Dienste unter einer zentralen URL zusammen, leitet Requests weiter und \u00fcbernimmt Querschnittsaufgaben wie Authentifizierung, Rate Limiting und Logging. Spring Cloud Gateway ist der reaktive, auf WebFlux basierende Gateway-Baustein [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4,5],"tags":[],"class_list":["post-662","post","type-post","status-publish","format-standard","hentry","category-plain_java","category-spring"],"_links":{"self":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/662","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=662"}],"version-history":[{"count":1,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/662\/revisions"}],"predecessor-version":[{"id":663,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/662\/revisions\/663"}],"wp:attachment":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=662"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=662"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=662"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}