{"id":4219,"date":"2018-09-06T23:43:41","date_gmt":"2018-09-06T21:43:41","guid":{"rendered":"http:\/\/www.tutego.de\/blog\/javainsel\/?p=4219"},"modified":"2018-09-06T23:43:41","modified_gmt":"2018-09-06T21:43:41","slug":"http-client-und-websocket-api-in-java-11","status":"publish","type":"post","link":"https:\/\/www.tutego.de\/blog\/javainsel\/2018\/09\/http-client-und-websocket-api-in-java-11\/","title":{"rendered":"HTTP Client und WebSocket API in Java 11"},"content":{"rendered":"<p>Der HTTP-Standard ist schon relativ alt, und die Urspr\u00fcnge wurden Anfang der 1990er Jahre gelegt. Offiziell wurde die Version 1.0 im Jahr 1996 verabschiedet, also etwa zu gleichen Zeit, als Java 1.0 erschien. 2015 wurde HTTP\/2 verabschiedet, und viele Verbesserungen kamen in den Standard. Die Java-Klassen rund um HTTP wurden allerdings nicht aktualisiert, sodass quelloffene Bibliotheken wie Apache HttpComponents (http:\/\/hc.apache.org\/) oder die Asynchronous Http and WebSocket Client library for Java (http:\/\/github.com\/AsyncHttpClient\/async-http-client) die L\u00fccken f\u00fcllten.<\/p>\n<h3>1.1.1\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Modul java.net.http<\/h3>\n<p>Statt die existierenden HTTP-Klassen wie HttpURLConnection um die Neuerungen von HTTP\/2 zu erweitern, hat Oracle das Modul java.net.http eingef\u00fchrt. Erstmalig wurde es in Java 9 im \u00bbBrutkasten\u00ab (engl. incubator) mit ausgeliefert und in Java 11 festgeschrieben. Neben synchronen Aufrufen k\u00f6nnen auch asynchrone Aufrufe get\u00e4tigt werden, die ein modernes CompletableFuture lieferrn.<\/p>\n<p>Das Modul besteht aus einem Paket java.net.http und den wesentlichen Typen:<\/p>\n<ul>\n<li>HttpClient<\/li>\n<li>HttpRequest, HttpResponse<\/li>\n<li>WebSocket<\/li>\n<\/ul>\n<p>Schauen wir uns ein Beispiel an:<\/p>\n<pre>try {\r\n\r\n\u00a0 URI uri = new URI( \"https:\/\/tutego.de\/\" );\r\n\r\n\u00a0 HttpRequest request = HttpRequest.newBuilder().uri( uri ).GET().build();\r\n\r\n\u00a0 HttpResponse&lt;String&gt; response =\r\n\r\n\u00a0\u00a0\u00a0 HttpClient.newHttpClient().send( request, BodyHandlers.ofString() );\r\n\r\n\u00a0 System.out.println( response.body() );\r\n\r\n}\r\n\r\ncatch ( URISyntaxException | IOException | InterruptedException e ) {\r\n\r\n\u00a0 e.printStackTrace();\r\n\r\n}<\/pre>\n<p>Die Methoden von HttpRequest sind allesamt abstrakt.<\/p>\n<p>abstract class java.net.http.<strong>HttpRequest<\/strong><\/p>\n<ul>\n<li>Optional&lt;HttpRequest.BodyPublisher&gt; bodyPublisher()<\/li>\n<li>boolean expectContinue()<\/li>\n<li>HttpHeaders headers()<\/li>\n<li>String method()<\/li>\n<li>Builder newBuilder()<\/li>\n<li>Builder newBuilder(URI uri)<\/li>\n<li>Optional&lt;Duration&gt; timeout()<\/li>\n<li>URI uri()<\/li>\n<li>Version version()<\/li>\n<\/ul>\n<p>F\u00fchrt der HttpClient die Anfrage aus, bekommen wir ein HttpResponse; die Schnittstelle deklariert folgende Methoden:<\/p>\n<p>public interface java.net.http.<strong>HttpResponse&lt;T&gt;<\/strong><\/p>\n<ul>\n<li>T body()<\/li>\n<li>HttpHeaders headers()<\/li>\n<li>Optional&lt;HttpResponse&lt;T&gt;&gt; previousResponse()<\/li>\n<li>HttpRequest request()<\/li>\n<li>Optional&lt;SSLSession&gt; sslSession()<\/li>\n<li>int statusCode()<\/li>\n<li>URI uri()<\/li>\n<li>Version version()<\/li>\n<\/ul>\n<p>Was die Methode body() f\u00fcr einen Typ liefert, bestimmt die Parametrisierung von HttpResponse&lt;T&gt;, und die ergibt sich aus dem \u00fcbergebenen BodyHandler&lt;T&gt; der HttpClient-Methode send(\u2026):<\/p>\n<p>public abstract class java.net.http.<strong>HttpClient<\/strong><\/p>\n<ul>\n<li>static HttpClient newHttpClient()<\/li>\n<li>HttpResponse&lt;T&gt; send(HttpRequest req, HttpResponse.BodyHandler&lt;T&gt; responseBodyHandler)<\/li>\n<\/ul>\n<p>Der BodyHandler ist eine funktionale Schnittstelle mit einer Methode<\/p>\n<ul>\n<li>BodySubscriber&lt;T&gt; apply\u200b(HttpResponse.ResponseInfo responseInfo)<\/li>\n<\/ul>\n<p>Es gibt einige vordefinierte Implementierungen in der Klasse HttpResponse.BodyHandlers:<\/p>\n<p>public static class java.net.http.<strong>HttpResponse.BodyHandlers<\/strong><\/p>\n<ul>\n<li>static HBodyHandler&lt;byte[]&gt; ofByteArray()<\/li>\n<li>staticBodyHandler&lt;Path&gt; ofFile\u200b(Path file)<\/li>\n<li>static HttpRespoBodyHandler&lt;Stream&lt;String&gt;&gt; ofLines()<\/li>\n<li>static HBodyHandler&lt;String&gt; ofString()<\/li>\n<\/ul>\n<p>Weitere Methoden nennt die Javadoc.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Der HTTP-Standard ist schon relativ alt, und die Urspr\u00fcnge wurden Anfang der 1990er Jahre gelegt. Offiziell wurde die Version 1.0 im Jahr 1996 verabschiedet, also etwa zu gleichen Zeit, als Java 1.0 erschien. 2015 wurde HTTP\/2 verabschiedet, und viele Verbesserungen kamen in den Standard. Die Java-Klassen rund um HTTP wurden allerdings nicht aktualisiert, sodass quelloffene [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":"","_links_to":"","_links_to_target":""},"categories":[11],"tags":[],"class_list":["post-4219","post","type-post","status-publish","format-standard","hentry","category-insel"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/4219","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/comments?post=4219"}],"version-history":[{"count":1,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/4219\/revisions"}],"predecessor-version":[{"id":4220,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/4219\/revisions\/4220"}],"wp:attachment":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/media?parent=4219"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/categories?post=4219"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/tags?post=4219"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}