In diesem Artikel wird die Verwendung des Jersey -Clients zur Anfrage des Spring -Boot -Dienstes (Restful) vorgestellt und mit Ihnen wie folgt mit Ihnen teilt:
Jersey Client erhält die Kapselung der Client -Objektinstanz:
@Service ("JerseypoolingClient") Public Class JerseypoolingClientFactoryBean implementiert FactoryBean <Client>, Initialisierungsbean, DisposableBean { /*** Die Client -Schnittstelle ist die grundlegende Schnittstelle des REST -Clients und wird verwendet, um mit dem Restserver zu kommunizieren. Der Kunde wird als ein Schwergewichtsobjekt definiert, das die verschiedenen Objekte am Ende der Client -Kommunikation verwaltet, z. B. Anschlüsse, Parsers usw. Daher wird nicht empfohlen, eine große Anzahl von Client -Instanzen in der Anwendung zu generieren. Dies ist in der Entwicklung notwendig. Darüber hinaus erfordert diese Schnittstelle, dass die Instanz geschlossen werden muss, andernfalls verursacht sie Speicherleckage*/ privater Client -Client. / ** * Die maximale Anzahl von Verbindungen für einen Client beträgt Standard 2000 */ privat int maxotal = 2000; / *** Die maximale Standardzahl von Verbindungen pro Route*/ private int defaultmaxPerRoute = 1000; private ClientConfig ClientConfig; public JerseypoolingClientFactoryBean () {} / *** Konstruktor mit Konfiguration* @param clientConfig* / public JerseypoolingClientFactoryBean (ClientConfig ClientConfig) {this.clientConfig = clientConfig; } public JerseypoolingClientFactoryBean (int maxtotal, int defaultmaxPerRoute) {this.maxtotal = maxtotal; this.defaultmaxPerRoute = DefaultMaxPerRoute; } / ** * Achtung: * Details: Client -Ressourcen veröffentlichen, wenn Container zerstört wird } / ** * * Achtung: * Details: Initialisieren Sie das Client -Objekt in Form eines Verbindungspools * @Author Chhliu * / @Override public void AfterPertieSt () löst eine Ausnahme aus {// Wenn der Konstruktor mit Clientconfig nicht verwendet wird, wird der Anschluss der Klassennull. neuer ClientConfig (); // Verbindungspool-Management-Instanz ist diese Klasse mit Thread-Safe und unterstützt mehrere gleichzeitige Operationen PoolinghttpClientConnectionManager PCM = New PoolinghttpclientConnectionManager (); pcm.setMaxtotal (this.maxtotal); pcm.setDefaultMaxPerRoute (this.DefaultMaxperRoute); ClientConfig.Property (ApacheClientProperties.Connection_Manager, PCM); / * * Bei der Verwendung von Jersey zum Anfordern von Spring Boot -Dienst verwendet Spring Boot Jackson standardmäßig JSON, während Jersey Moxy standardmäßig analysiert. Wenn Jersey Client möchte, dass der Spring -Boot -Service Ressourcen anfordert,* veranlasst dieser Unterschied, dass der Server und der Client Pojo unterschiedlich konvertieren, was zu Deserialisierungsfehlern führt. // Verwenden Sie den Konfigurations -Apache -Connector, der Standard -Anschluss ist httpurlConnector clientconfig.connectorProvider (neuer ApacheConnectorProvider ()); Client = ClientBuilder.NewClient (ClientConfig); } else {// Verwenden Sie ClientConfig im Konstruktor, um das Client -Objekt client = clientBuilder.newclient (this.clientConfig) zu initialisieren; }} /** * Achtung: * Details: Gibt das Client -Objekt zurück. Wenn das Objekt null ist, erstellen Sie einen Standard -Client * @author chhliu */ @Override public client getObject () löst eine Ausnahme aus {if (null == this.client) {return ClientBuilder.newclient (); } return this.client; } / ** * Achtung: * Details: Holen Sie sich den Typ des Client -Objekts * @author chhliu * / @Override public class <?> getObjecttype () {return (this.client == null? client.class: this.client.getClass ()); } / ** * Achtung: * Details: Ob das Client -Objekt ein Singleton ist, Standard für einen Singleton * @Author Chhliu * / @Override public boolean issingleton () {return true; }}Anfragen der Einkapselung des Spring -Boot -Dienstes:
@Component ("JerseyClient") öffentlicher Klasse JerseyClient {@Resource (name = "JerseypoolingClient") private Client Client; /** * Achtung: * Details: Abfragen Sie das Objekt über ID * @Author chhliu */public resultmsg <githubentity> getResponebyId (endgültige String -ID) löst JsonprocessingException aus, ioException {webtarget webtarget = client.target ("http: // localHost: 8080"). Invocation.builder invocationBuilder = webtarget.request (mediateType.application_json); GenericType <resultmsg <githubentity >> generictype = new GenericType <resultmsg <githubentity >> () {}; Antwort Antwort = invocationBuilder.get (); if (response.getStatus () == 200) { /** Wenn die Readentity -Methode aufgerufen wird, veröffentlicht das Programm die Verbindung automatisch* Auch wenn die Readtity -Methode nicht aufgerufen wird und das generische Typ -Objekt direkt zurückgegeben wird, wird die zugrunde liegende Ebene die Verbindung* / Return -Antwort veröffentlicht. } else {resultmsg <githubentity> res = neue resultmsg <githubentity> (); Res.SetErrorCode (string.ValueOf (response.getStatus ())); Res.Seterrormsg (response.getStatusinfo (). toString ()); res.setok (false); return res; }} / ** * Achtung: * Details: Pagination Query * @author chhliu * / public resultmsg <pager <githubentity >> getgithubwithpager (endgültiger Integer pageOffset, endgültiger Integer pageSize, endgültiger String -OrderColumn) {webTarget webtarget = client.target ("http: // localhost: 8080") .Path ("/github/get/user/page") .Queryparam ("pageOffset", pageOffset) .Queryparam ("pageSize", pagessize) .Queryparam ("ordnungscolumn", ordnungscolumn); // Beachten Sie, dass der entsprechende Parameter im Dienst im Dienst von @RequestBody invocation. GenericType <resultmsg <pager <githubentity >>>>>> generictype = new generictype <resultmsg <pager <githubentity >>> () {}; Antwort Antwort = invocationBuilder.get (); if (response.getStatus () == 200) {return response.readEntity (GenericType); } else {resultmsg <pager <githubentity >> res = neue resultmsg <pager <githubentity >> (); Res.SetErrorCode (string.ValueOf (response.getStatus ())); Res.Seterrormsg (response.getStatusinfo (). toString ()); res.setok (false); return res; }} / ** * Achtung: * Details: Abfrage basierend auf Benutzername * @author chhliu * / public resultmsg <list <githubentity >> getResponseByUnername (endgültiger String Benutzername) löscht JsonprocessingException, IoException {webtarget webtarget = aus. client.target ("http: // localhost: 8080") .Path ("/github/get/user/"+username); Invocation.builder invocationBuilder = webtarget.request (mediateType.application_json); GenericType <resultmsg <list <githubentity >>> generictype = new GenericType <resultmsg <list <githubentity >>> () {}; Antwort Antwort = invocationBuilder.get (); if (response.getStatus () == 200) {return response.readEntity (GenericType); } else {resultmsg <list <githubentity >>> res = neue resultmsg <list <githubentity >> (); Res.SetErrorCode (string.ValueOf (response.getStatus ())); Res.Seterrormsg (response.getStatusinfo (). toString ()); res.setok (false); return res; }}/** * Achtung: * Details: Löschen Sie einen Datensatz basierend auf ID * @author chhliu */public resultmsg <githubentity> deleteById (endgültige String -ID) löst JsonprocessingException aus, ioException {webtarget target = client.target ("http: // localHost: 8080"). GenericType <resultmsg <githubentity >> generictype = new GenericType <resultmsg <githubentity >> () {}; Antwort Antwort = Ziel.Request (). Delete (); if (response.getStatus () == 200) {return response.readEntity (GenericType); } else {resultmsg <githubentity> res = neue resultmsg <githubentity> (); Res.SetErrorCode (string.ValueOf (response.getStatus ())); Res.Seterrormsg (response.getStatusinfo (). toString ()); res.setok (false); return res; }}/** * Achtung: * Details: Aktualisieren Sie einen Datensatz * @author chhliu */public resultmsg <githubentity> update (endgültige Githubentity -Entität) löst JsonProcessingException aus, ioException {webtarget target = client.target ("http: // localHost: 8080). GenericType <resultmsg <githubentity >> generictype = new GenericType <resultmsg <githubentity >> () {}; Antwort Antwort = target.Request (). Buildput (Entity.Entity (Entity, Mediitype.Application_json)). Invoke (); if (response.getStatus () == 200) {return response.readEntity (GenericType); } else {resultmsg <githubentity> res = neue resultmsg <githubentity> (); Res.SetErrorCode (string.ValueOf (response.getStatus ())); Res.Seterrormsg (response.getStatusinfo (). toString ()); res.setok (false); return res; }}/** * Achtung: * Details: Fügen Sie einen Datensatz ein * @author chhliu */public resultmsg <githubentity> speichern (endgültige Githubentity -Entität) löst JsonProcessingException aus, ioException {WebTarget target = client.target ("http: // localHost: 8080). GenericType <resultmsg <githubentity >> generictype = new GenericType <resultmsg <githubentity >> () {}; Antwort Antwort = target.Request (). BuildPost (Entity.Entity (Entity, Mediitype.Application_json)). Invoke (); if (response.getStatus () == 200) {return response.readEntity (GenericType); } else {resultmsg <githubentity> res = neue resultmsg <githubentity> (); Res.SetErrorCode (string.ValueOf (response.getStatus ())); Res.Seterrormsg (response.getStatusinfo (). toString ()); res.setok (false); return res; }}} Detaillierte Erklärung der Jersey -Client -Schnittstelle
1 Client -Schnittstelle
Das Erstellen einer Client -Instanz wird über ClientBuilder konstruiert. Normalerweise wird eine Clientconfig -Instanz als Parameter verwendet. Wenn wir Client = ClientBuilder.newclient () verwenden, um eine Client -Instanz zu erstellen, erstellen wir jedes Mal eine Client -Instanz, aber die Instanz ist ein Schwergewichtsobjekt. Daher wird empfohlen, das HTTP -Verbindungsbad zu verwenden, um Verbindungen zu verwalten, anstatt jedes Mal ein Client -Objekt zu erstellen, wenn wir anfordern. Für bestimmte Methoden zur Verwaltung von Verbindungspools finden Sie im obigen Codebeispiel.
2 WebTarget -Schnittstelle
Die Webtarget -Schnittstelle ist eine Schnittstelle, die eine Ressourcenpositionierung für REST -Clients implementiert. Über die Webtarget -Schnittstelle können wir die spezifische Adresse der angeforderten Ressource, Abfrageparameter und Medientypinformationen usw. definieren. Die Methodenkette von WebTarget muss den Rückgabewert der Methode als Handle für den nachfolgenden Prozess festlegen. Was bedeutet das? Siehe folgende Beispiele:
Beispiel 1: StringBuffer -Methode -Kette Beispiel Kette
StringBuffer sb = new StringBuffer ("lch"); SB.Append ("Hallo"); Sb.Append ("Welt"); SB.Append ("Hallo"). Anhänge ("Welt"); // Diese Methode entspricht den oben genannten zwei Codezeilen.Beispiel 2: WebTarget -Methode -Kette Beispiel
// Verwenden Sie eine Ein-Line-Code-Methode-Kette, um WebTarget WebTarget webtarget = client.target ("http: // localhost: 8080") zu instanziieren; webtarget.Path ("/github/get/user/page") .queryparam ("pageOffset", pageOffset) .queryparam ("pageSize", pageSize) .queryparam ("orderColumn", ordercolumn); // Hier wird die Verwendung von Methodenketten zur Instanziierung von WebTarget WebTarget.Path ("/github/get/user/page") verwendet. webtarget.queryparam ("pageOffset", pageOffset); webtarget.queryparam ("pageSize", pageSize); // Die Ergebnisse der beiden oben genannten Instanziierungsmethoden sind sehr unterschiedlich. Die obige Instanziierungsmethode ist in Ordnung, es gibt kein Problem, aber die folgende Instanziierungsmethode hat Probleme. In der folgenden Instanziierungsmethode generiert jede Zeile ein neues WebTarget -Objekt. Das ursprüngliche WebTarget spielte keine Rolle. Schließlich sind die Instanzen jeder Zeile unterschiedlich. Wenn wir es in mehreren Zeilen instanziieren möchten, müssen wir einen Griff für die Rückgabe jeder Methode bereitstellen. Die Methode lautet wie folgt: WebTarget target = client.target ("http: // localhost: 8080"); Webtarget pathTarget = target.Path ("/github/get/user/page"); Webtarget paramtarget = pathTarget.queryparam ("pageOffset", pageOffset); // Verwenden Sie beim letzten Verwenden das letzte WebTarget -Instanzobjekt 3 Aufladungsschnittstelle
Die Schnittstelle zur Aufruf ist eine Schnittstelle, die nach Abschluss der Ressourcenpositionierungskonfiguration eine Anforderung an den Restserver initiiert. Die Anfrage enthält zwei Methoden: Synchronisation und asynchron. Es wird durch die Builder -Schnittstelle in der Aufrufschnittstelle definiert. Die Builder -Schnittstelle erbt die Synchronisationsschnittstelle Syncinvoker. Die Beispiele für asynchrone Anrufe sind wie folgt:
Future <resultmsg <list <githubentity >>> response = invocationBuilder.async (). Get (genericType); if (response.isdone ()) {return response.get (); } Die Instanz der Aufruf. Standardmäßig ist der Rückgabe von HTTP -Methoden -Aufruf -Typ der Antworttyp und unterstützt auch den Rückgabewert des generischen Typs. Im obigen Beispiel haben wir eine große Anzahl von Generika verwendet, sodass wir hier nicht zu viel erklären werden.
Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, es wird für das Lernen aller hilfreich sein und ich hoffe, jeder wird Wulin.com mehr unterstützen.