Cet article présente l'utilisation du client de Jersey pour demander le service Spring Boot (Restful) et le partage avec vous, comme suit:
Le client de Jersey obtient l'encapsulation de l'instance d'objet client:
@Service ("JerseyPoolingClient") Classe publique JerseyPoolingClientFactoryBean implémente FactoryBean <Simité>, InitializingBean, DisposableBean {/ ** * L'interface client est l'interface de base du client REST et est utilisée pour communiquer avec le serveur de repos. Le client est défini comme un objet poids lourd qui gère les différents objets au bas de la communication du client, tels que les connecteurs, les analyseurs, etc. Par conséquent, il n'est pas recommandé de générer un grand nombre d'instances clients dans l'application. Ceci est nécessaire dans le développement. De plus, cette interface nécessite que l'instance doit être fermée, sinon elle entraînera une fuite de mémoire * / client privé; / ** * Le nombre maximum de connexions pour un client, la valeur par défaut est 2000 * / private int maxtotal = 2000; / ** * Le nombre maximum par défaut de connexions par route * / private int defaultMaxPerRoute = 1000; ClientConfig privé ClientConfig; public JerseyPoolingClientFactoryBean () {} / ** * Constructeur avec configuration * @param clientConfig * / public JerseyPoolingClientFactoryBean (clientConfig clientConfig) {this.clientConfig = clientConfig; } public JerseyPoolingClientFactoryBean (int maxtotal, int defaultMaxPerRoute) {this.maxtotal = maxtotal; this.defaultMaxPerRoute = defaultMaxPerRoute; } / ** * ATTENTION: * Détails: Libérez les ressources du client lorsque le conteneur est détruit * @author chhliu * / @Override public void destrement () lève l'exception {this.client.close (); } / ** * * Attention: * Détails: Initialisez l'objet client sous la forme d'un pool de connexion * @author chhliu * / @Override public void afterpropertiesset () lance l'exception {// Si le constructeur avec clientConfig n'est pas utilisé ClientConfig (); // Instance de gestion de pool de connexion, cette classe est en filetage et prend en charge plusieurs opérations simultanées PooringHttpClientConnectionManager pcm = new PooringHttpClientConnectionManager (); pcm.setMextotal (this.mextotal); pcm.setDefaultMaxPerRoute (this.defaultMaxPerRoute); clientConfig.Property (apacheclientproperties.connection_manager, pcm); / * * Lorsque vous utilisez Jersey pour demander Spring Boot Service, Spring Boot utilise Jackson pour analyser JSON par défaut *, tandis que Jersey utilise Moxy pour analyser JSON par défaut. Lorsque Jersey Client souhaite que Spring Boot Service demande des ressources, * cette différence amènera le serveur et le client à convertir POJO différemment, entraînant des erreurs de désérialisation * Par conséquent, vous devez enregistrer la fonctionnalité Jackson dans l'instance de configuration du client ici * / clientConfig.register (JacksonFeature.class); // Utilisez le connecteur APache Configuration, le connecteur par défaut est httpurlconnector clientConfig.connectorProvider (new apacheconnectorprovider ()); client = clientBuilder.NewClient (clientConfig); } else {// Utilisez ClientConfig dans le constructeur pour initialiser l'objet client client = clientBuilder.newClient (this.clientConfig); }} / ** * Attention: * Détails: Renvoie l'objet client. Si l'objet est null, créez un client par défaut * @author chhliu * / @Override public client getObject () lève exception {if (null == this.client) {return clientBuilder.newClient (); } return this.client; } / ** * Attention: * Détails: Obtenez le type de l'objet client * @author chhliu * / @Override public class <?> getObjectType () {return (this.client == null? client.class: this.clientclass ()); } / ** * Attention: * Détails: si l'objet client est un singleton, par défaut à un singleton * @author chhliu * / @Override public boolean issingleton () {return true; }}Demande de l'encapsulation du service de démarrage Spring:
@Component ("JerseyClient") classe publique JerseyClient {@Resource (name = "JerseyPoolingClient") Client privé; / ** * ATTENTION: * Détails: Recherchez l'objet via ID * @Author Chhliu * / Public ResultMsg <GitHubentity> GetResponseById (Final String ID) lance JSONProcessingException, ioException {webTargetEt webTarget = Client.Target ("http: // lochost: 8080") .path ("/ github / user /". Invocation.builder invocationBuilder = webTarget.Request (mediatype.application_json); GenericType <resultmsg <gitHubentity>> genericType = new GenericType <resultmsg <gitHubentity>> () {}; Réponse réponse = invocationBuilder.get (); if (Response.getStatus () == 200) {/ * * Lorsque la méthode de lecture est appelée, le programme libérera automatiquement la connexion * Même si la méthode de lecture n'est pas appelée et l'objet de type générique est renvoyé directement, la couche sous-jacente publiera toujours la connexion * / retour réponse.readentity (générique); } else {resultmsg <gitHubentity> res = new resultmsg <githubentity> (); res.setErrorCode (string.valueof (réponse.getStatus ())); res.seTerrormsg (Response.getStatusInfo (). ToString ()); res.setok (false); return res; }} / ** * Attention: * Détails: Pagination Query * @author chhliu * / public resultmsg <pager <gitHubentity>> getGitHubWithPager (final entier pageoffset, final entier, pagesize, final String OrderColumn) {webTarget webTarget = client.target ("http: // localhost: 8080") .path ("/ github / get / users / page") .Queryparam ("pageoffset", pageoffset) .QueryParam ("pagesize", pagesize) .QueryParam ("orderColumn", orderColumn); // Notez que si le type de support ici est MediaType.Application_json, le paramètre correspondant dans le service doit être précédé par @Requestbody invocation.builder invocationBuilder = webTarget.Request (mediatype.application_json); GenericType <resultmsg <pager <githubentity >>>> genericType = new GenericType <resultmsg <pager <githubentity >>> () {}; Réponse réponse = invocationBuilder.get (); if (Response.getStatus () == 200) {return Response.ReadEntity (genericType); } else {resultmsg <pager <gitHubentity >> res = new resultmsg <pager <gitHubentity >> (); res.setErrorCode (string.valueof (réponse.getStatus ())); res.seTerrormsg (Response.getStatusInfo (). ToString ()); res.setok (false); return res; }} / ** * ATTENTION: * Détails: Query basé sur le nom d'utilisateur * @author chhliu * / public resultmsg <list <gitHubentity>> getResponseByUserName (Final String Username) lève JSONProcesingException, ioException {webTarget webTarget = client.target ("http: // localhost: 8080") .path ("/ github / get / users /" + username); Invocation.builder invocationBuilder = webTarget.Request (mediatype.application_json); GenericType <resultmsg <list <gitHubentity >>> genericType = new GenericType <resultmsg <list <gitHubentity >>> () {}; Réponse réponse = invocationBuilder.get (); if (Response.getStatus () == 200) {return Response.ReadEntity (genericType); } else {resultmsg <list <githubentity>>> res = new resultmsg <list <gitHubentity>> (); res.setErrorCode (string.valueof (réponse.getStatus ())); res.seTerrormsg (Response.getStatusInfo (). ToString ()); res.setok (false); return res; }} / ** * Attention: * Détails: Supprimer un enregistrement basé sur ID * @Author Chhliu * / Public ResultimeMsg <GitHubentity> DeleteById (Final String ID) JSONProcessingException, ioException {webTarget Target = Client.Target ("http: // lochost: 8080") .path ("/ github / Derete /" + id); GenericType <resultmsg <gitHubentity>> genericType = new GenericType <resultmsg <gitHubentity>> () {}; Réponse réponse = cible.Request (). Delete (); if (Response.getStatus () == 200) {return Response.ReadEntity (genericType); } else {resultmsg <gitHubentity> res = new resultmsg <githubentity> (); res.setErrorCode (string.valueof (réponse.getStatus ())); res.seTerrormsg (Response.getStatusInfo (). ToString ()); res.setok (false); return res; }} / ** * Attention: * Détails: Mettez à jour un enregistrement * @author chhliu * / public resultMSG <GitHubentity> Update (final gitHubentity Entity) lance JSONProcessingException, ioException {webTarget Target = client.target ("http: // local: 8080") .path ("/ github / put"); GenericType <resultmsg <gitHubentity>> genericType = new GenericType <resultmsg <gitHubentity>> () {}; Réponse réponse = cible.request (). Buildput (entité.entity (entité, mediatype.application_json)). Invoke (); if (Response.getStatus () == 200) {return Response.ReadEntity (genericType); } else {resultmsg <gitHubentity> res = new resultmsg <githubentity> (); res.setErrorCode (string.valueof (réponse.getStatus ())); res.seTerrormsg (Response.getStatusInfo (). ToString ()); res.setok (false); return res; }} / ** * Attention: * Détails: insérer un enregistrement * @author chhliu * / public resultmsg <githubentity> sauve (final githubentity entity) lance jsonprocessingException, ioException {webTarget cible = client.target ("http: // local: 8080") .path ("/ github / post"); GenericType <resultmsg <gitHubentity>> genericType = new GenericType <resultmsg <gitHubentity>> () {}; Response Response = Target.Request (). BuildPost (Entity.entity (Entity, mediaType.Application_JSON)). Invoke (); if (Response.getStatus () == 200) {return Response.ReadEntity (genericType); } else {resultmsg <gitHubentity> res = new resultmsg <githubentity> (); res.setErrorCode (string.valueof (réponse.getStatus ())); res.seTerrormsg (Response.getStatusInfo (). ToString ()); res.setok (false); return res; }}} Explication détaillée de l'interface client de Jersey
1 interface client
La création d'une instance client est construite via ClientBuilder. Habituellement, une instance ClientConfig est utilisée comme paramètre. Si nous utilisons le client client = clientBuilder.newClient () pour créer une instance client, nous créerons une instance client à chaque fois, mais l'instance est un objet poids lourd. Par conséquent, il est recommandé d'utiliser le regroupement de connexions HTTP pour gérer les connexions, plutôt que de créer un objet client à chaque fois que nous demandons. Pour des méthodes de gestion de pool de connexions spécifiques, consultez l'exemple de code ci-dessus.
2 interface webtarget
L'interface WebTarget est une interface qui implémente le positionnement des ressources pour les clients REST. Grâce à l'interface WebTarget, nous pouvons définir l'adresse spécifique de la ressource demandée, des paramètres de requête et des informations de type de support, etc. Nous pouvons compléter la configuration d'une instance WebTarget via une chaîne de méthodes, mais il convient de noter que bien que la méthode d'utilisation de WebTarget soit très similaire à la chaîne de méthode de StringBuffer, elle est essentiellement différente. La chaîne de méthode de webTarget doit définir la valeur de retour de la méthode en tant que poignée au processus ultérieur. Qu'est-ce que cela signifie? Voir les exemples suivants:
Exemple 1: Exemple de chaîne de méthode StringBuffer
StringBuffer sb = new StringBuffer ("lch"); SB.APPEND ("Hello"); SB.APPEND ("Monde"); SB.APPEND ("Hello"). APPEND ("World"); // Cette méthode est la même que les deux lignes de code ci-dessus.Exemple 2: Exemple de chaîne de méthode WebTarget
// Utilisez une chaîne de méthode de code en ligne pour instancier webTarget webTarget webTarget = client.target ("http: // localhost: 8080"); webTarget.path ("/ github / get / utilisateurs / page") .QueryParam ("PageOffset", pageOffSet) .QueryParam ("PageSize", pagesize) .QueryParam ("OrderColumn", OrderColumn); // voici l'utilisation de chaînes de méthode pour instancier webtarget webtarget.path ("/ github / get / users / page"); webTarget.QueryParam ("PageOffset", pageOffset); webTarget.QueryParam ("PageSize", PageSize); // Les résultats des deux méthodes d'instanciation ci-dessus sont très différents. La méthode d'instanciation ci-dessus est OK, il n'y a pas de problème, mais la méthode d'instanciation suivante a des problèmes. Dans la méthode d'instanciation suivante, chaque ligne générera un nouvel objet WebTarget. Le webtarget original n'a joué aucun rôle. Après tout, les instances de chaque ligne sont différentes. Si nous voulons l'instancier en plusieurs lignes, nous devons fournir une poignée pour le retour de chaque méthode. La méthode est la suivante: webTarget Target = client.target ("http: // localhost: 8080"); WebTarget pathtarget = cible.path ("/ github / get / utilisateurs / page"); WebTarget paramtarget = pathtarget.QueryParam ("pageoffset", pageOffset); // Lorsque vous l'utilisez en dernier, utilisez le dernier objet d'instance WebTarget 3 Interface d'invocation
L'interface d'invocation est une interface qui initie une demande au serveur de repos après avoir terminé la configuration de positionnement des ressources. La demande comprend deux méthodes: la synchronisation et les asynchrones. Il est défini par l'interface du constructeur à l'intérieur de l'interface d'invocation. L'interface du constructeur hérite de l'interface de synchronisation Syncinvoker. Les exemples d'appels asynchrones sont les suivants:
Futur <resultmsg <list <gitHubentity >>> réponse = invocationBuilder.async (). Get (genericType); if (réponse.isdone ()) {return réponse.get (); } L'instance d'interface invocation.builder exécute les demandes de GET et Post pour soumettre des requêtes et crée respectivement. Par défaut, le type de retour de l'appel de méthode HTTP est le type de réponse, et il prend également en charge la valeur de retour du type générique. Dans l'exemple ci-dessus, nous avons utilisé un grand nombre de génériques, nous n'expliquerons donc pas trop ici.
Ce qui précède est tout le contenu de cet article. J'espère que cela sera utile à l'apprentissage de tous et j'espère que tout le monde soutiendra davantage Wulin.com.