{"id":423,"date":"2024-06-01T22:00:09","date_gmt":"2024-06-01T21:00:09","guid":{"rendered":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/?p=423"},"modified":"2024-06-26T22:04:28","modified_gmt":"2024-06-26T21:04:28","slug":"erstellen-von-grpc-services-in-spring-boot","status":"publish","type":"post","link":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/?p=423","title":{"rendered":"Erstellen von gRPC-Services in Spring Boot"},"content":{"rendered":"\n<h4 class=\"wp-block-heading\">Einleitung<\/h4>\n\n\n\n<p>gRPC (gRPC Remote Procedure Call) ist ein modernes, Open-Source Remote Procedure Call (RPC)-Framework, das von Google entwickelt wurde. Es erm\u00f6glicht die einfache Kommunikation zwischen verteilten Systemen und Diensten in einer leistungsstarken und effizienten Weise. Durch die Verwendung von HTTP\/2, Protokollpuffer (Protocol Buffers) und bidirektionalem Streaming bietet gRPC erhebliche Vorteile gegen\u00fcber traditionellen RESTful APIs, insbesondere in Bezug auf Leistung und Skalierbarkeit.<\/p>\n\n\n\n<p>Spring Boot, ein beliebtes Framework f\u00fcr die Erstellung von Microservices in Java, unterst\u00fctzt gRPC nicht direkt, aber durch die Verwendung des <code>grpc-spring-boot-starter<\/code> wird die Integration von gRPC in Spring Boot-Projekte erheblich vereinfacht. In diesem Artikel werden wir einen detaillierten Leitfaden zur Erstellung von gRPC-Services in Spring Boot mit dem <code>grpc-spring-boot-starter<\/code> bereitstellen.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Voraussetzungen<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Grundlegende Kenntnisse in Java und Spring Boot<\/li>\n\n\n\n<li>Maven oder Gradle als Build-Tool<\/li>\n\n\n\n<li>Eine Entwicklungsumgebung wie IntelliJ IDEA oder Eclipse<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">Einrichtung des Projekts<\/h4>\n\n\n\n<p>Zuerst m\u00fcssen wir ein neues Spring Boot-Projekt erstellen. Dies kann \u00fcber die Spring Initializr-Webseite (https:\/\/start.spring.io\/) erfolgen oder direkt in Ihrer bevorzugten Entwicklungsumgebung. Stellen Sie sicher, dass Sie <code>Maven Project<\/code> und <code>Java<\/code> ausw\u00e4hlen, und f\u00fcgen Sie die folgenden Abh\u00e4ngigkeiten hinzu:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Spring Boot DevTools<\/li>\n\n\n\n<li>Spring Web<\/li>\n\n\n\n<li>Protobuf (f\u00fcr Protokollpuffer)<\/li>\n<\/ul>\n\n\n\n<p>Nachdem das Projekt erstellt wurde, m\u00fcssen wir die <code>grpc-spring-boot-starter<\/code>-Abh\u00e4ngigkeit zu unserer <code>pom.xml<\/code> (f\u00fcr Maven) oder <code>build.gradle<\/code> (f\u00fcr Gradle) hinzuf\u00fcgen.<\/p>\n\n\n\n<p><strong>F\u00fcr Maven:<\/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>net.devh<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>grpc-spring-boot-starter<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">artifactId<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">version<\/span>&gt;<\/span>2.13.0.RELEASE<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">version<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">dependency<\/span>&gt;<\/span><\/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><strong>F\u00fcr Gradle:<\/strong><\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">implementation <span class=\"hljs-string\">'net.devh:grpc-spring-boot-starter:2.13.0.RELEASE'<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><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<h4 class=\"wp-block-heading\">Definition des Protobuf-Dateiformats<\/h4>\n\n\n\n<p>Als N\u00e4chstes m\u00fcssen wir unsere gRPC-Services in einer <code>.proto<\/code>-Datei definieren. Erstellen Sie eine neue Datei namens <code>greeting.proto<\/code> im Verzeichnis <code>src\/main\/proto\/<\/code> mit folgendem Inhalt:<\/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\">syntax = <span class=\"hljs-string\">\"proto3\"<\/span>;\n\noption java_multiple_files = <span class=\"hljs-literal\">true<\/span>;\noption java_package = <span class=\"hljs-string\">\"com.example.grpc\"<\/span>;\noption java_outer_classname = <span class=\"hljs-string\">\"GreetingProto\"<\/span>;\n\nservice GreetingService {\n    rpc greet (GreetingRequest) returns (GreetingResponse);\n}\n\nmessage GreetingRequest {\n    string name = <span class=\"hljs-number\">1<\/span>;\n}\n\nmessage GreetingResponse {\n    string message = <span class=\"hljs-number\">1<\/span>;\n}<\/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>Diese Datei definiert einen gRPC-Service <code>GreetingService<\/code> mit einer RPC-Methode <code>greet<\/code>, die eine <code>GreetingRequest<\/code> empf\u00e4ngt und eine <code>GreetingResponse<\/code> zur\u00fcckgibt.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Generierung der Java-Klassen aus der Protobuf-Datei<\/h4>\n\n\n\n<p>Um die Java-Klassen aus der Protobuf-Datei zu generieren, m\u00fcssen wir das <code>protobuf-maven-plugin<\/code> in unsere <code>pom.xml<\/code> hinzuf\u00fcgen:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" 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\">build<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">extensions<\/span>&gt;<\/span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">extension<\/span>&gt;<\/span>\n            <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId<\/span>&gt;<\/span>kr.motd.maven<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>os-maven-plugin<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">artifactId<\/span>&gt;<\/span>\n            <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">version<\/span>&gt;<\/span>1.6.2<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">version<\/span>&gt;<\/span>\n        <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">extension<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">extensions<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">plugins<\/span>&gt;<\/span>\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">plugin<\/span>&gt;<\/span>\n            <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId<\/span>&gt;<\/span>org.xolstice.maven.plugins<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>protobuf-maven-plugin<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">artifactId<\/span>&gt;<\/span>\n            <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">version<\/span>&gt;<\/span>0.6.1<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">version<\/span>&gt;<\/span>\n            <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">configuration<\/span>&gt;<\/span>\n                <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">protocArtifact<\/span>&gt;<\/span>com.google.protobuf:protoc:3.14.0:exe:${os.detected.classifier}<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">protocArtifact<\/span>&gt;<\/span>\n            <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">configuration<\/span>&gt;<\/span>\n            <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">executions<\/span>&gt;<\/span>\n                <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">execution<\/span>&gt;<\/span>\n                    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">goals<\/span>&gt;<\/span>\n                        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">goal<\/span>&gt;<\/span>compile<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">goal<\/span>&gt;<\/span>\n                        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">goal<\/span>&gt;<\/span>compile-custom<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">goal<\/span>&gt;<\/span>\n                    <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">goals<\/span>&gt;<\/span>\n                <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">execution<\/span>&gt;<\/span>\n            <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">executions<\/span>&gt;<\/span>\n        <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">plugin<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">plugins<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">build<\/span>&gt;<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><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>F\u00fchren Sie <code>mvn clean install<\/code> aus, um die Protobuf-Dateien zu kompilieren und die entsprechenden Java-Klassen zu generieren.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Implementierung des gRPC-Services<\/h4>\n\n\n\n<p>Jetzt k\u00f6nnen wir unseren gRPC-Service in Java implementieren. Erstellen Sie eine neue Klasse <code>GreetingServiceImpl<\/code> in einem geeigneten Paket (z.B. <code>com.example.grpc.service<\/code>) und erweitern Sie die generierte <code>GreetingServiceGrpc.GreetingServiceImplBase<\/code>-Klasse:<\/p>\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\">package com.example.grpc.service;\n\n<span class=\"hljs-keyword\">import<\/span> com.example.grpc.GreetingRequest;\n<span class=\"hljs-keyword\">import<\/span> com.example.grpc.GreetingResponse;\n<span class=\"hljs-keyword\">import<\/span> com.example.grpc.GreetingServiceGrpc;\n<span class=\"hljs-keyword\">import<\/span> io.grpc.stub.StreamObserver;\n<span class=\"hljs-keyword\">import<\/span> net.devh.boot.grpc.server.service.GrpcService;\n\n@GrpcService\npublic <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">GreetingServiceImpl<\/span> <span class=\"hljs-keyword\">extends<\/span> <span class=\"hljs-title\">GreetingServiceGrpc<\/span>.<span class=\"hljs-title\">GreetingServiceImplBase<\/span> <\/span>{\n\n    @Override\n    public <span class=\"hljs-keyword\">void<\/span> greet(GreetingRequest request, StreamObserver&lt;GreetingResponse&gt; responseObserver) {\n        <span class=\"hljs-built_in\">String<\/span> name = request.getName();\n        <span class=\"hljs-built_in\">String<\/span> message = <span class=\"hljs-string\">\"Hello, \"<\/span> + name + <span class=\"hljs-string\">\"!\"<\/span>;\n\n        GreetingResponse response = GreetingResponse.newBuilder()\n                .setMessage(message)\n                .build();\n\n        responseObserver.onNext(response);\n        responseObserver.onCompleted();\n    }\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<p>Diese Klasse implementiert die <code>greet<\/code>-Methode des <code>GreetingService<\/code>. Sie empf\u00e4ngt eine <code>GreetingRequest<\/code>, erstellt eine <code>GreetingResponse<\/code> und sendet diese zur\u00fcck an den Client.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Konfiguration von gRPC in Spring Boot<\/h4>\n\n\n\n<p>Die <code>grpc-spring-boot-starter<\/code>-Abh\u00e4ngigkeit konfiguriert gRPC automatisch in Ihrem Spring Boot-Projekt. Es sind jedoch einige Konfigurationen erforderlich, um den Server richtig zu starten. F\u00fcgen Sie die folgenden Einstellungen zu Ihrer <code>application.properties<\/code> hinzu:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">grpc.server.port=9090<\/code><\/span><\/pre>\n\n\n<p>Diese Einstellung gibt den Port an, auf dem der gRPC-Server lauschen soll. Der Standardwert ist 9090, aber Sie k\u00f6nnen ihn nach Bedarf \u00e4ndern.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Erstellen eines gRPC-Clients<\/h4>\n\n\n\n<p>Um den gRPC-Service zu testen, k\u00f6nnen wir einen einfachen gRPC-Client erstellen. Erstellen Sie eine neue Klasse <code>GreetingClient<\/code>:<\/p>\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\">package com.example.grpc.client;\n\n<span class=\"hljs-keyword\">import<\/span> com.example.grpc.GreetingRequest;\n<span class=\"hljs-keyword\">import<\/span> com.example.grpc.GreetingResponse;\n<span class=\"hljs-keyword\">import<\/span> com.example.grpc.GreetingServiceGrpc;\n<span class=\"hljs-keyword\">import<\/span> io.grpc.ManagedChannel;\n<span class=\"hljs-keyword\">import<\/span> io.grpc.ManagedChannelBuilder;\n<span class=\"hljs-keyword\">import<\/span> org.springframework.stereotype.Component;\n\n<span class=\"hljs-keyword\">import<\/span> javax.annotation.PostConstruct;\n<span class=\"hljs-keyword\">import<\/span> javax.annotation.PreDestroy;\n\n@Component\npublic <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">GreetingClient<\/span> <\/span>{\n\n    private GreetingServiceGrpc.GreetingServiceBlockingStub stub;\n    private ManagedChannel channel;\n\n    @PostConstruct\n    public <span class=\"hljs-keyword\">void<\/span> init() {\n        channel = ManagedChannelBuilder.forAddress(<span class=\"hljs-string\">\"localhost\"<\/span>, <span class=\"hljs-number\">9090<\/span>)\n                .usePlaintext()\n                .build();\n\n        stub = GreetingServiceGrpc.newBlockingStub(channel);\n    }\n\n    public <span class=\"hljs-built_in\">String<\/span> greet(<span class=\"hljs-built_in\">String<\/span> name) {\n        GreetingRequest request = GreetingRequest.newBuilder()\n                .setName(name)\n                .build();\n\n        GreetingResponse response = stub.greet(request);\n        <span class=\"hljs-keyword\">return<\/span> response.getMessage();\n    }\n\n    @PreDestroy\n    public <span class=\"hljs-keyword\">void<\/span> shutdown() {\n        <span class=\"hljs-keyword\">if<\/span> (channel != <span class=\"hljs-literal\">null<\/span>) {\n            channel.shutdown();\n        }\n    }\n}<\/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>Dieser Client stellt eine Verbindung zum gRPC-Server her und ruft die <code>greet<\/code>-Methode auf. Um den Client zu verwenden, k\u00f6nnen Sie ihn in einem Spring Boot-Controller einbinden und eine REST-Endpoint erstellen:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">package com.example.grpc.controller;\n\n<span class=\"hljs-keyword\">import<\/span> com.example.grpc.client.GreetingClient;\n<span class=\"hljs-keyword\">import<\/span> org.springframework.web.bind.annotation.GetMapping;\n<span class=\"hljs-keyword\">import<\/span> org.springframework.web.bind.annotation.RequestParam;\n<span class=\"hljs-keyword\">import<\/span> org.springframework.web.bind.annotation.RestController;\n\n@RestController\npublic <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">GreetingController<\/span> <\/span>{\n\n    private final GreetingClient greetingClient;\n\n    public GreetingController(GreetingClient greetingClient) {\n        <span class=\"hljs-keyword\">this<\/span>.greetingClient = greetingClient;\n    }\n\n    @GetMapping(<span class=\"hljs-string\">\"\/greet\"<\/span>)\n    public <span class=\"hljs-built_in\">String<\/span> greet(@RequestParam <span class=\"hljs-built_in\">String<\/span> name) {\n        <span class=\"hljs-keyword\">return<\/span> greetingClient.greet(name);\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\">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>Mit diesem Controller k\u00f6nnen Sie den gRPC-Service \u00fcber einen einfachen HTTP-GET-Request aufrufen, z.B. <code>http:\/\/localhost:8080\/greet?name=World<\/code>.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Fazit<\/h4>\n\n\n\n<p>Die Integration von gRPC in Spring Boot mit dem <code>grpc-spring-boot-starter<\/code> ist relativ einfach und bietet eine leistungsstarke Alternative zu herk\u00f6mmlichen RESTful APIs. Mit der M\u00f6glichkeit, bidirektionales Streaming und Protokollpuffer zu nutzen, ist gRPC besonders f\u00fcr hochskalierbare und performante Microservices-Architekturen geeignet. Durch die in diesem Artikel beschriebenen Schritte k\u00f6nnen Sie einen gRPC-Service schnell und effizient in Ihrem Spring Boot-Projekt implementieren.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Einleitung gRPC (gRPC Remote Procedure Call) ist ein modernes, Open-Source Remote Procedure Call (RPC)-Framework, das von Google entwickelt wurde. Es erm\u00f6glicht die einfache Kommunikation zwischen verteilten Systemen und Diensten in einer leistungsstarken und effizienten Weise. Durch die Verwendung von HTTP\/2, Protokollpuffer (Protocol Buffers) und bidirektionalem Streaming bietet gRPC erhebliche Vorteile gegen\u00fcber traditionellen RESTful APIs, insbesondere [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5],"tags":[],"class_list":["post-423","post","type-post","status-publish","format-standard","hentry","category-spring"],"_links":{"self":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/423","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=423"}],"version-history":[{"count":1,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/423\/revisions"}],"predecessor-version":[{"id":424,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/423\/revisions\/424"}],"wp:attachment":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=423"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=423"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=423"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}