Ich werde einen RESTful-Anruf in Java tätigen. Ich weiß jedoch nicht, wie ich den Anruf tätigen soll. Muss ich die URLConnection oder andere verwenden? Kann mir jemand helfen. Danke.
Dies hängt davon ab, wie Sie in Ihrer Anwendung Ruhegespräche führen. Verwenden Sie eine JaxRS-Implementierung? Ein bestimmter? Führen Sie Anfragen manuell durch?
Colin Hebert
@Colin Hebert, danke für deine Antwort. Aber ich habe keine Ahnung von dem RESTful-Aufruf. Können Sie mir weitere Informationen zu verschiedenen Teilen des RESTful-Aufrufs geben?
Wenn Sie einen RESTful-Dienst von einem Dienstanbieter (z. B. Facebook, Twitter) anrufen, können Sie dies mit einer beliebigen Variante Ihrer Wahl tun :
Wenn Sie keine externen Bibliotheken verwenden möchten, können Sie java.net.HttpURLConnectionoder javax.net.ssl.HttpsURLConnection(für SSL) verwenden. Dies ist jedoch ein Aufruf, der in einem Factory-Typmuster in gekapselt ist java.net.URLConnection. Um das Ergebnis zu erhalten, müssen connection.getInputStream()Sie eine zurückgeben InputStream. Anschließend müssen Sie Ihren Eingabestream in eine Zeichenfolge konvertieren und die Zeichenfolge in das repräsentative Objekt (z. B. XML, JSON usw.) analysieren.
Alternativ Apache HttpClient (Version 4 ist die neueste). Es ist stabiler und robuster als die Standardeinstellung von Java URLConnectionund unterstützt die meisten (wenn nicht alle) HTTP-Protokolle (und kann auch auf den strengen Modus eingestellt werden). Ihre Antwort bleibt erhalten InputStreamund Sie können sie wie oben erwähnt verwenden.
Erfinden Sie das Rad nicht neu, verwenden Sie eine der vorhandenen RESTful-Implementierungen.
Qwerky
13
Es ist nicht neu zu erfinden, ich sage, Sie können verwenden, was flavourSie wollen. Einige wollen die Standardeinstellung URLConnection, andere wollen HttpClient. In jedem Fall steht es Ihnen zur Verfügung.
Buhake Sindi
@ The Elite Gentleman, vielen Dank für Ihre Antwort. Nachdem ich die gesamte Bibliothek überprüft habe, möchte ich den Apache HttpClient verwenden. Würde es Ihnen etwas ausmachen, mir weitere Informationen zu dieser Bibliothek zu geben?
Fragen
@Fragen, der Link zu den HttpClient 4-Beispielen scheint unterbrochen zu sein. Wenn Sie also Fragen haben (Wortspiel beabsichtigt ... lol), lassen Sie es mich wissen ... Ich beschäftige mich fast täglich damit.
Buhake Sindi
Bitte zeigen Sie einen Beispielcode für die Verwendung dieser Klassen, anstatt nur ihre Existenz zu notieren
Jonathan
150
Update: Es ist fast 5 Jahre her, seit ich die Antwort unten geschrieben habe; Heute habe ich eine andere Perspektive.
In 99% der Fälle, in denen Menschen den Begriff REST verwenden, meinen sie wirklich HTTP. Sie könnten sich weniger um „Ressourcen“, „Darstellungen“, „Statusübertragungen“, „einheitliche Schnittstellen“, „Hypermedien“ oder andere Einschränkungen oder Aspekte des von Fielding identifizierten REST-Architekturstils kümmern . Die von verschiedenen REST-Frameworks bereitgestellten Abstraktionen sind daher verwirrend und nicht hilfreich.
Also: Sie möchten 2015 HTTP-Anfragen mit Java senden. Sie möchten eine API, die klar, ausdrucksstark, intuitiv, idiomatisch und einfach ist. Was ist zu verwenden? Ich verwende kein Java mehr, aber in den letzten Jahren war OkHttp die vielversprechendste und interessanteste Java-HTTP-Client-Bibliothek . Hör zu.
Sie können definitiv mit RESTful-Webdiensten interagieren, indem Sie URLConnectionoder HTTPClient verwenden, um HTTP-Anforderungen zu codieren.
Im Allgemeinen ist es jedoch wünschenswerter, eine Bibliothek oder ein Framework zu verwenden, das eine einfachere und semantischere API bietet, die speziell für diesen Zweck entwickelt wurde. Dies erleichtert das Schreiben, Lesen und Debuggen des Codes und reduziert Doppelarbeit. Diese Frameworks implementieren im Allgemeinen einige großartige Funktionen, die in Bibliotheken niedrigerer Ebenen nicht unbedingt vorhanden oder einfach zu verwenden sind, z. B. Inhaltsverhandlung, Caching und Authentifizierung.
Form form =newForm();
form.add("x","foo");
form.add("y","bar");ClientResource resource =newClientResource("http://localhost:8080/someresource");Response response = resource.post(form.getWebRepresentation());if(response.getStatus().isSuccess()){System.out.println("Success! "+ response.getStatus());System.out.println(response.getEntity().getText());}else{System.out.println("ERROR! "+ response.getStatus());System.out.println(response.getEntity().getText());}
Natürlich sind GET-Anforderungen noch einfacher, und Sie können auch Dinge wie Entitäts-Tags und Accept-Header angeben , aber hoffentlich sind diese Beispiele nicht trivial, aber nicht zu komplex.
Wie Sie sehen können, haben Restlet und Jersey ähnliche Client-APIs. Ich glaube, sie wurden ungefähr zur gleichen Zeit entwickelt und haben sich daher gegenseitig beeinflusst.
Ich finde die Restlet-API etwas semantischer und daher etwas klarer, aber YMMV.
Wie gesagt, ich bin mit Restlet am besten vertraut, ich habe es jahrelang in vielen Apps verwendet und bin sehr zufrieden damit. Es ist ein sehr ausgereiftes, robustes, einfaches, effektives, aktives und gut unterstütztes Framework. Ich kann nicht mit Jersey oder RESTEasy sprechen, aber ich habe den Eindruck, dass beide auch eine gute Wahl sind.
Aber immer noch ein toller Beitrag. Und ich muss zustimmen, dass "99% der Zeit, in der Menschen den Begriff REST verwenden, wirklich HTTP bedeuten; ... Die Abstraktionen, die von verschiedenen REST-Frameworks bereitgestellt werden, sind daher verwirrend und nicht hilfreich."
AlexD
2
Wo / wie wird in Ihrem Jersey-Beispiel das Formularobjekt verwendet? Es wurde erstellt, aber es scheint dem Beispiel nichts hinzuzufügen.
Splungebob
29
Dies ist in Java sehr kompliziert, weshalb ich vorschlagen würde, die RestTemplateAbstraktion von Spring zu verwenden :
String result =
restTemplate.getForObject("http://example.com/hotels/{hotel}/bookings/{booking}",String.class,"42","21");
Es gibt einige wirklich gute REST-APIs. Ich würde empfehlen, eine zu verwenden, anstatt das Rad neu zu erfinden.
Qwerky
wie gesagt: höllisch kompliziert. (Nein, ich habe dies nicht abgelehnt, es ist eine absolut gültige Lösung)
Sean Patrick Floyd
4
@Qwerky Client-seitige API-Bibliotheken verstoßen normalerweise gegen REST-Einschränkungen. Sie führen viel zu viel Kopplung ein. Die Verwendung einer guten HTTP-Bibliothek ist auf lange Sicht eine viel bessere Option.
Darrel Miller
10
Es gibt mehrere RESTful-APIs. Ich würde Jersey empfehlen;
BookStore store =JAXRSClientFactory.create("http://bookstore.com",BookStore.class);// (1) remote GET call to http://bookstore.com/bookstoreBooks books = store.getAllBooks();// (2) no remote callBookResource subresource = store.getBookSubresource(1);// {3} remote GET call to http://bookstore.com/bookstore/1Book b = subresource.getDescription();
Die einfachste Lösung wird die Apache http-Client-Bibliothek verwenden. Siehe folgenden Beispielcode. Dieser Code verwendet die grundlegende Sicherheit für die Authentifizierung.
Antworten:
Wenn Sie einen RESTful-Dienst von einem Dienstanbieter (z. B. Facebook, Twitter) anrufen, können Sie dies mit einer beliebigen Variante Ihrer Wahl tun :
Wenn Sie keine externen Bibliotheken verwenden möchten, können Sie
java.net.HttpURLConnection
oderjavax.net.ssl.HttpsURLConnection
(für SSL) verwenden. Dies ist jedoch ein Aufruf, der in einem Factory-Typmuster in gekapselt istjava.net.URLConnection
. Um das Ergebnis zu erhalten, müssenconnection.getInputStream()
Sie eine zurückgebenInputStream
. Anschließend müssen Sie Ihren Eingabestream in eine Zeichenfolge konvertieren und die Zeichenfolge in das repräsentative Objekt (z. B. XML, JSON usw.) analysieren.Alternativ Apache HttpClient (Version 4 ist die neueste). Es ist stabiler und robuster als die Standardeinstellung von Java
URLConnection
und unterstützt die meisten (wenn nicht alle) HTTP-Protokolle (und kann auch auf den strengen Modus eingestellt werden). Ihre Antwort bleibt erhaltenInputStream
und Sie können sie wie oben erwähnt verwenden.Dokumentation zu HttpClient: http://hc.apache.org/httpcomponents-client-ga/tutorial/html/index.html
quelle
flavour
Sie wollen. Einige wollen die StandardeinstellungURLConnection
, andere wollenHttpClient
. In jedem Fall steht es Ihnen zur Verfügung.Update: Es ist fast 5 Jahre her, seit ich die Antwort unten geschrieben habe; Heute habe ich eine andere Perspektive.
In 99% der Fälle, in denen Menschen den Begriff REST verwenden, meinen sie wirklich HTTP. Sie könnten sich weniger um „Ressourcen“, „Darstellungen“, „Statusübertragungen“, „einheitliche Schnittstellen“, „Hypermedien“ oder andere Einschränkungen oder Aspekte des von Fielding identifizierten REST-Architekturstils kümmern . Die von verschiedenen REST-Frameworks bereitgestellten Abstraktionen sind daher verwirrend und nicht hilfreich.
Also: Sie möchten 2015 HTTP-Anfragen mit Java senden. Sie möchten eine API, die klar, ausdrucksstark, intuitiv, idiomatisch und einfach ist. Was ist zu verwenden? Ich verwende kein Java mehr, aber in den letzten Jahren war OkHttp die vielversprechendste und interessanteste Java-HTTP-Client-Bibliothek . Hör zu.
Sie können definitiv mit RESTful-Webdiensten interagieren, indem Sie
URLConnection
oder HTTPClient verwenden, um HTTP-Anforderungen zu codieren.Im Allgemeinen ist es jedoch wünschenswerter, eine Bibliothek oder ein Framework zu verwenden, das eine einfachere und semantischere API bietet, die speziell für diesen Zweck entwickelt wurde. Dies erleichtert das Schreiben, Lesen und Debuggen des Codes und reduziert Doppelarbeit. Diese Frameworks implementieren im Allgemeinen einige großartige Funktionen, die in Bibliotheken niedrigerer Ebenen nicht unbedingt vorhanden oder einfach zu verwenden sind, z. B. Inhaltsverhandlung, Caching und Authentifizierung.
Einige der ausgereiftesten Optionen sind Jersey , RESTEasy und Restlet .
Ich bin mit Restlet und Jersey am besten vertraut. Schauen wir uns an, wie wir
POST
mit beiden APIs eine Anfrage stellen würden.Jersey Beispiel
Restlet-Beispiel
Natürlich sind GET-Anforderungen noch einfacher, und Sie können auch Dinge wie Entitäts-Tags und
Accept
-Header angeben , aber hoffentlich sind diese Beispiele nicht trivial, aber nicht zu komplex.Wie Sie sehen können, haben Restlet und Jersey ähnliche Client-APIs. Ich glaube, sie wurden ungefähr zur gleichen Zeit entwickelt und haben sich daher gegenseitig beeinflusst.
Ich finde die Restlet-API etwas semantischer und daher etwas klarer, aber YMMV.
Wie gesagt, ich bin mit Restlet am besten vertraut, ich habe es jahrelang in vielen Apps verwendet und bin sehr zufrieden damit. Es ist ein sehr ausgereiftes, robustes, einfaches, effektives, aktives und gut unterstütztes Framework. Ich kann nicht mit Jersey oder RESTEasy sprechen, aber ich habe den Eindruck, dass beide auch eine gute Wahl sind.
quelle
Dies ist in Java sehr kompliziert, weshalb ich vorschlagen würde, die
RestTemplate
Abstraktion von Spring zu verwenden :Referenz:
RestTemplate
quelle
Wenn Sie nur einen einfachen Aufruf eines REST-Dienstes von Java aus benötigen, verwenden Sie etwas in dieser Richtung
quelle
Es gibt mehrere RESTful-APIs. Ich würde Jersey empfehlen;
https://jersey.java.net/
Die Client-API-Dokumentation finden Sie hier.
https://jersey.java.net/documentation/latest/index.html
Der Speicherort
für die OAuth-Dokumente im Kommentar unten ist ein toter Link und wurde zu https://jersey.java.net/nonav/documentation/latest/security.html#d0e12334 verschoben
quelle
Ich möchte meine persönlichen Erfahrungen mit dem Aufruf eines REST-WS mit einem Post-JSON-Aufruf teilen:
quelle
Sie können den CXF auschecken . Den JAX-RS-Artikel finden Sie hier
So einfach ist das Anrufen (Zitat):
quelle
In der Tat ist dies "in Java sehr kompliziert":
Von: https://jersey.java.net/documentation/latest/client.html
quelle
Die einfachste Lösung wird die Apache http-Client-Bibliothek verwenden. Siehe folgenden Beispielcode. Dieser Code verwendet die grundlegende Sicherheit für die Authentifizierung.
Fügen Sie die folgende Abhängigkeit hinzu.
quelle
Ich sehe viele Antworten, hier ist, was wir in 2020 WebClient verwenden , und BTW RestTemplate wird veraltet sein. (kann dies überprüfen) RestTemplate wird veraltet sein
quelle
Sie können den Async Http Client (die Bibliothek unterstützt auch das WebSocket- Protokoll) folgendermaßen verwenden:
quelle