{"id":63,"date":"2023-12-03T23:53:12","date_gmt":"2023-12-03T22:53:12","guid":{"rendered":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/?p=63"},"modified":"2024-01-08T09:13:49","modified_gmt":"2024-01-08T08:13:49","slug":"https-in-java-11","status":"publish","type":"post","link":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/?p=63","title":{"rendered":"HTTP(S) in Java 11+"},"content":{"rendered":"\n<p>Mit der Einf\u00fchrung von Java 11 wurde (endlich!) ein leistungsstarker HTTP-Client direkt in die Standardbibliothek integriert. Dieser HTTP-Client bietet eine benutzerfreundliche Schnittstelle f\u00fcr die Kommunikation mit HTTP-basierten Diensten und ersetzt damit das veraltete <code>HttpURLConnection<\/code>. In diesem Artikel werden wir uns mit der Verwendung dieses HTTP-Clients befassen, sowohl im synchronen als auch im asynchronen Modus, und die Vor- und Nachteile der beiden Modi untersuchen.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Der synchrone Modus<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Einf\u00fchrung in den synchronen Modus<\/h3>\n\n\n\n<p>Der synchrone Modus des Java 11 HTTP-Clients ist einfach zu verwenden und bietet eine blockierende Schnittstelle f\u00fcr die Ausf\u00fchrung von HTTP-Anfragen. Im Wesentlichen bedeutet dies, dass der Code auf die Antwort des Servers wartet, bevor er mit der Ausf\u00fchrung des restlichen Codes fortsetzt. Hier ist ein einfaches Beispiel:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">import<\/span> java.net.URI;\n<span class=\"hljs-keyword\">import<\/span> java.net.http.HttpClient;\n<span class=\"hljs-keyword\">import<\/span> java.net.http.HttpRequest;\n<span class=\"hljs-keyword\">import<\/span> java.net.http.HttpResponse;\n\npublic <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">SynchronousExample<\/span> <\/span>{\n    public <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">void<\/span> main(<span class=\"hljs-built_in\">String<\/span>&#91;] args) throws Exception {\n        HttpClient httpClient = HttpClient.newHttpClient();\n        HttpRequest request = HttpRequest.newBuilder()\n                .uri(<span class=\"hljs-keyword\">new<\/span> URI(<span class=\"hljs-string\">\"https:\/\/api.example.com\/data\"<\/span>))\n                .build();\n\n        HttpResponse&lt;<span class=\"hljs-built_in\">String<\/span>&gt; response = httpClient.send(request, HttpResponse.BodyHandlers.ofString());\n\n        System.out.println(<span class=\"hljs-string\">\"Response Code: \"<\/span> + response.statusCode());\n        System.out.println(<span class=\"hljs-string\">\"Response Body: \"<\/span> + response.body());\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><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\">Vor- und Nachteile des synchronen Modus<\/h3>\n\n\n\n<p><strong>Vorteile:<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Einfache Verwendung:<\/strong> Der synchrone Modus ist sehr einfach zu verstehen und zu verwenden, insbesondere f\u00fcr einfache Anwendungsf\u00e4lle.<\/li>\n\n\n\n<li><strong>Blockierende Natur:<\/strong> Die blockierende Natur des synchronen Modus kann in einigen Szenarien von Vorteil sein, insbesondere wenn der Programmierer darauf wartet, dass die Anfrage abgeschlossen ist, bevor er mit anderen Aufgaben fortf\u00e4hrt.<\/li>\n<\/ol>\n\n\n\n<p><strong>Nachteile:<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Skalierbarkeit:<\/strong> Bei einer gro\u00dfen Anzahl gleichzeitiger Anfragen kann die blockierende Natur des synchronen Modus zu einer schlechten Skalierbarkeit f\u00fchren, da jede Anfrage auf die Antwort warten muss, bevor die n\u00e4chste gestartet wird.<\/li>\n\n\n\n<li><strong>Ressourcenauslastung:<\/strong> Da jede Anfrage einen eigenen Thread blockiert, kann dies zu einer ineffizienten Ressourcenauslastung f\u00fchren, insbesondere in Anwendungen mit vielen gleichzeitigen Anfragen.<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">Der asynchrone Modus<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Einf\u00fchrung in den asynchronen Modus<\/h3>\n\n\n\n<p>Der asynchrone Modus des Java 11 HTTP-Clients erm\u00f6glicht es, mehrere Anfragen gleichzeitig ohne Blockierung auszuf\u00fchren. Dies geschieht durch die Verwendung von <code>CompletableFuture<\/code>, einer Klasse, die in Java 8 eingef\u00fchrt wurde und asynchrone Programmierung unterst\u00fctzt. Hier ist ein Beispiel f\u00fcr die asynchrone Verwendung:<\/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\"><span class=\"hljs-keyword\">import<\/span> java.net.URI;\n<span class=\"hljs-keyword\">import<\/span> java.net.http.HttpClient;\n<span class=\"hljs-keyword\">import<\/span> java.net.http.HttpRequest;\n<span class=\"hljs-keyword\">import<\/span> java.net.http.HttpResponse;\n<span class=\"hljs-keyword\">import<\/span> java.util.concurrent.CompletableFuture;\n\npublic <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">AsynchronousExample<\/span> <\/span>{\n    public <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">void<\/span> main(<span class=\"hljs-built_in\">String<\/span>&#91;] args) throws Exception {\n        HttpClient httpClient = HttpClient.newHttpClient();\n        HttpRequest request = HttpRequest.newBuilder()\n                .uri(<span class=\"hljs-keyword\">new<\/span> URI(<span class=\"hljs-string\">\"https:\/\/api.example.com\/data\"<\/span>))\n                .build();\n\n        CompletableFuture&lt;HttpResponse&lt;<span class=\"hljs-built_in\">String<\/span>&gt;&gt; futureResponse = \n                httpClient.sendAsync(request, HttpResponse.BodyHandlers.ofString());\n\n        futureResponse.thenAccept(response -&gt; {\n            System.out.println(<span class=\"hljs-string\">\"Response Code: \"<\/span> + response.statusCode());\n            System.out.println(<span class=\"hljs-string\">\"Response Body: \"<\/span> + response.body());\n        });\n\n        <span class=\"hljs-comment\">\/\/ Warten, bis alle asynchronen Anfragen abgeschlossen sind<\/span>\n        CompletableFuture.allOf(futureResponse).join();\n    }\n}<\/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<h3 class=\"wp-block-heading\">Vor- und Nachteile des asynchronen Modus<\/h3>\n\n\n\n<p><strong>Vorteile:<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Skalierbarkeit:<\/strong> Der asynchrone Modus erm\u00f6glicht die gleichzeitige Ausf\u00fchrung mehrerer Anfragen ohne Blockierung, was zu besserer Skalierbarkeit in Anwendungen mit vielen gleichzeitigen Anfragen f\u00fchrt.<\/li>\n\n\n\n<li><strong>Effizienz:<\/strong> Da keine Threads blockiert werden, wird die Ressourcenauslastung optimiert, insbesondere in Szenarien mit vielen gleichzeitigen Anfragen.<\/li>\n<\/ol>\n\n\n\n<p><strong>Nachteile:<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Komplexit\u00e4t:<\/strong> Die asynchrone Programmierung kann komplexer sein und erfordert ein grundlegendes Verst\u00e4ndnis von <code>CompletableFuture<\/code> und asynchronen Konzepten.<\/li>\n\n\n\n<li><strong>Weniger Lesbarkeit:<\/strong> Der asynchrone Code kann f\u00fcr einige Entwickler weniger intuitiv sein, insbesondere wenn es um das Verketten von asynchronen Operationen geht.<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">Welchen Modus sollte man w\u00e4hlen?<\/h2>\n\n\n\n<p>Die Wahl zwischen dem synchronen und asynchronen Modus h\u00e4ngt von den Anforderungen Ihrer Anwendung ab.<\/p>\n\n\n\n<p><strong>Verwenden Sie den synchronen Modus, wenn:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ihre Anwendung haupts\u00e4chlich einfache HTTP-Anfragen sendet und auf die Antwort wartet.<\/li>\n\n\n\n<li>Die Blockierung des Threads w\u00e4hrend der Anfragebearbeitung keine negativen Auswirkungen auf die Leistung hat.<\/li>\n\n\n\n<li>Die Code-Lesbarkeit und -wartbarkeit wichtiger sind als die Skalierbarkeit.<\/li>\n<\/ul>\n\n\n\n<p><strong>Verwenden Sie den asynchronen Modus, wenn:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ihre Anwendung viele gleichzeitige Anfragen verarbeiten muss und eine h\u00f6here Skalierbarkeit erforderlich ist.<\/li>\n\n\n\n<li>Die Effizienz der Ressourcennutzung ein kritischer Faktor ist.<\/li>\n\n\n\n<li>Sie Erfahrung mit asynchroner Programmierung haben und die Komplexit\u00e4t akzeptieren k\u00f6nnen.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Fazit<\/h2>\n\n\n\n<p>Der in Java 11 eingebaute HTTP-Client bietet eine flexible L\u00f6sung f\u00fcr die Kommunikation mit HTTP-basierten Diensten. Die Wahl zwischen synchronem und asynchronem Modus h\u00e4ngt von den spezifischen Anforderungen Ihrer Anwendung ab. Sowohl der synchrone als auch der asynchrone Modus haben ihre Vor- und Nachteile, und die Entscheidung sollte sorgf\u00e4ltig abgewogen werden, um die bestm\u00f6gliche Leistung und Benutzerfreundlichkeit zu gew\u00e4hrleisten.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Mit der Einf\u00fchrung von Java 11 wurde (endlich!) ein leistungsstarker HTTP-Client direkt in die Standardbibliothek integriert. Dieser HTTP-Client bietet eine benutzerfreundliche Schnittstelle f\u00fcr die Kommunikation mit HTTP-basierten Diensten und ersetzt damit das veraltete HttpURLConnection. In diesem Artikel werden wir uns mit der Verwendung dieses HTTP-Clients befassen, sowohl im synchronen als auch im asynchronen Modus, und [&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],"tags":[],"class_list":["post-63","post","type-post","status-publish","format-standard","hentry","category-plain_java"],"_links":{"self":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/63","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=63"}],"version-history":[{"count":1,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/63\/revisions"}],"predecessor-version":[{"id":64,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/63\/revisions\/64"}],"wp:attachment":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=63"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=63"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=63"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}