Este artículo presenta el uso del cliente de Jersey para solicitar el servicio Spring Boot (RESTFUL) y lo comparte con usted, como sigue:
Jersey Client obtiene la encapsulación de la instancia del objeto del cliente:
@Service ("JerseyipoolingClient") JerseyypoolingClientClientFactoryBean implementa FactoryBean <Client>, Inicializando Bean, DisposableBean { /*** La interfaz del cliente es la interfaz básica del cliente REST y se usa para comunicarse con el servidor REST. El cliente se define como un objeto de peso pesado que administra los diversos objetos en la parte inferior de la comunicación del cliente, como conectores, analizadores, etc. Por lo tanto, no se recomienda generar una gran cantidad de instancias del cliente en la aplicación. Esto es necesario en el desarrollo. Además, esta interfaz requiere que la instancia esté cerrada, de lo contrario causará una fuga de memoria*/ cliente privado cliente; / ** * El número máximo de conexiones para un cliente, el valor predeterminado es 2000 */ private int maxtotal = 2000; / *** El número máximo predeterminado de conexiones por ruta*/ private int DefaultMaxperRoute = 1000; ClientCig private ClientConfig; public jerseypeolingClientFactoryBean () {} / *** constructor con configuración* @param clientConfig* / public jerseypeolingClientFactoryBean (ClientConfig ClientConfig) {this.clientConfig = ClientConfig; } public jerseypeolingClientFactoryBean (int maxtotal, int defaultMaxperRoute) {this.mAxtotal = maxtotal; this.defaultMaxperRoute = defaultMaxperRoute; } / ** * Atención: * Detalles: Libere los recursos del cliente cuando el contenedor se destruye * @author chhliu * / @Override public void destruye () arroja excepción {this.client.close (); } / ** * * Atención: * Detalles: Inicializar el objeto cliente en forma de un grupo de conexión * @author chhliu * / @Override public void AfterPropertiesSet () lanza la excepción {// si el constructor con clientCig no se usa, la instancia de la clase es null, y la configuración predeterminada se inicia si (this.clientConfig) ClientCig (); // Instancia de administración de grupos de conexión, esta clase es a prueba de hilo y admite múltiples operaciones concurrentes PoolinghtpClientConnectionManager PCM = new PoolingHttpClientConnectionManager (); PCM.SetMaTTOTAL (this.MaxTotal); pcm.setDefaultMaxperRoute (this.defaultMaxperRoute); ClientConfig.Property (apacheClientProperties.Connection_Manager, PCM); / * * Al usar Jersey para solicitar el servicio de arranque de Spring, Spring Boot usa Jackson para analizar JSON de forma predeterminada *, mientras que Jersey usa Moxy para analizar JSON de forma predeterminada. Cuando Jersey Client desea que el servicio de arranque de Spring solicite recursos,* Esta diferencia hará que el servidor y el cliente conviertan a POJO de manera diferente, lo que resulta en errores de deserialización* Por lo tanto, debe registrar la función Jackson en la instancia de configuración del cliente aquí*/ ClientCig.register (JacksonFeate.Class); // Usar el conector Apache Configuration, el conector predeterminado es httpurlconnector clientconfig.connectorProvider (new ApacheConnectorProvider ()); Client = ClientBuilder.NewClient (ClientConfig); } else {// use ClientConfig en el constructor para inicializar el objeto Client Client = ClientBuilder.NewClient (this.clientConfig); }} /** * Atención: * Detalles: Devuelve el objeto cliente. Si el objeto es nulo, cree un cliente predeterminado * @author chhliu */ @Override public Client getObject () lanza la excepción {if (null == this.client) {return clientBuilder.newClient (); } return this.client; } / ** * Atención: * Detalles: Obtenga el tipo de objeto cliente * @author chhliu * / @Override public class <?> getObjectType () {return (this.client == NULL? Client.class: this.client.getClass ()); } / ** * Atención: * Detalles: si el objeto del cliente es un singleton, predeterminado a un singleton * @author chhliu * / @Override public boolean issingleton () {return true; }}Solicitar la encapsulación del servicio de arranque de primavera:
@Component ("JerseyClient") Public Class JerseyClient {@Resource (name = "JerseyipoolingClient") Cliente de cliente privado; /** * Atención: * Detalles: Consulte el objeto a través de ID * @author chhliu */public denteMsg <GitHubeNity> getResponseById (ID de cadena final) lanza jsonprocessingException, ioException {webTarget webTarget = client.target ("http: // localhost: 8080") .path ("/" github/usuarios/" Invocation.Builder InvocalBuilder = WebTarget.Request (Mediatype.application_json); GenericType <resultMsg <GitHubEntity>> genericType = new GenericType <resultsg <GitHubeNity> () {}; Respuesta de respuesta = invocationBuilder.get (); if (respuesta.getStatus () == 200) { /** Cuando se llama al método de lectura, el programa liberará automáticamente la conexión* incluso si no se llama el método ReadEntity y el objeto de tipo genérico se devuelve directamente, la capa subyacente aún liberará la conexión* / return Response.ReadEntity (GenericType); } else {resultSmg <GitHubEntity> res = new resultmsg <GitHubEntity> (); res.setErrorCode (String.ValueOf (respuesta.getStatus ())); res.setErrormsg (respuesta.getStatusInfo (). toString ()); res.setok (falso); regresar res; }} / ** * Atención: * Detalles: consulta de paginación * @author chhliu * / public denteMsg <Pager <GitHubeNity>> getGitHubWithPager (PageOff de entero final, PageSize Integer Final, String Final String OrderColumn) {WebTarget webTarget = = = Client.Target ("http: // localhost: 8080") .path ("/github/get/users/page") .queram ("PageOffset", PageOffset) .QueryParam ("PageSize", PageSize) .QueryParam ("OrderColumn", OrderColumn); // Tenga en cuenta que si el tipo de medios aquí es mediatype.application_json, entonces el parámetro correspondiente en el servicio debe ser precedido por @RequestBody Invocation.Builder InvocatBuilder = WebTarget.Request (mediatype.application_json); GenericType <resultmsg <Pager <GitHubeNity>>>> genericType = new GenericType <resultsg <Pager <GitHubeNity>> () {}; Respuesta de respuesta = invocationBuilder.get (); if (respuesta.getStatus () == 200) {return Response.ReadEntity (GenericType); } else {resultsmg <Pager <GitHubeNity>> res = new resultsMg <Pager <GitHubeNity> (); res.setErrorCode (String.ValueOf (respuesta.getStatus ())); res.setErrormsg (respuesta.getStatusInfo (). toString ()); res.setok (falso); regresar res; }} / ** * Atención: * Detalles: Consulta basada en el nombre de usuario * @author chhliu * / public denteMsg <list <githubentity>> getResponseByUsername (nombre de usuario final) lanza JSONProcessingException, ioexception {webTarget webTarget = = Client.target ("http: // localhost: 8080") .path ("/github/get/users/"+username); Invocation.Builder InvocalBuilder = WebTarget.Request (Mediatype.application_json); GenericType <resultsg <list <GitHubeNity>>> genericType = new GenericType <resultsg <list <GitHubeNity>> () {}; Respuesta de respuesta = invocationBuilder.get (); if (respuesta.getStatus () == 200) {return Response.ReadEntity (GenericType); } else {resultsmg <list <GitHubeNity>>> res = new resultmsg <list <GitHubeNity> (); res.setErrorCode (String.ValueOf (respuesta.getStatus ())); res.setErrormsg (respuesta.getStatusInfo (). toString ()); res.setok (falso); regresar res; }}/** * Atención: * Detalles: Elimine un registro basado en ID * @author chhliu */public denteMsg <GithubeNity> deletyById (ID de cadena final) lanza jsonprocessingException, ioException {webTarget Target = Client.Target ("http: // localhost: 8080") .path ("/github/" GenericType <resultMsg <GitHubEntity>> genericType = new GenericType <resultsg <GitHubeNity> () {}; Respuesta de respuesta = Target.Request (). Delete (); if (respuesta.getStatus () == 200) {return Response.ReadEntity (GenericType); } else {resultSmg <GitHubEntity> res = new resultmsg <GitHubEntity> (); res.setErrorCode (String.ValueOf (respuesta.getStatus ())); res.setErrormsg (respuesta.getStatusInfo (). toString ()); res.setok (falso); regresar res; }}/** * Atención: * Detalles: Actualizar un registro * @author chhliu */public denteMsg <GitHubeNity> update (entidad final de githubeNity) lanza jsonprocessingException, ioException {webTarget Target = Client.Target ("http: // localhost: 8080") .path ("/"/github/stutget (petget ("http: // localhost: 8080") .path ("/"/github/stutget (petget "; GenericType <resultMsg <GitHubEntity>> genericType = new GenericType <resultsg <GitHubeNity> () {}; Respuesta de respuesta = Target.Request (). Buildput (entity.Entity (entidad, mediatype.application_json)). Invoke (); if (respuesta.getStatus () == 200) {return Response.ReadEntity (GenericType); } else {resultSmg <GitHubEntity> res = new resultmsg <GitHubEntity> (); res.setErrorCode (String.ValueOf (respuesta.getStatus ())); res.setErrormsg (respuesta.getStatusInfo (). toString ()); res.setok (falso); regresar res; }}/** * Atención: * Detalles: Insertar un registro * @author chhliu */public denteMsg <GithubeNity> save (entidad final de githubeNity) lanza jsonprocessingException, ioException {webTarget Target = Client.Target ("http: // localhost: 8080") .path ("/"/github/post "); GenericType <resultMsg <GitHubEntity>> genericType = new GenericType <resultsg <GitHubeNity> () {}; Respuesta de respuesta = Target.Request (). BuildPost (Entity.Entity (Entity, Mediatype.Application_Json)). Invoke (); if (respuesta.getStatus () == 200) {return Response.ReadEntity (GenericType); } else {resultSmg <GitHubEntity> res = new resultmsg <GitHubEntity> (); res.setErrorCode (String.ValueOf (respuesta.getStatus ())); res.setErrormsg (respuesta.getStatusInfo (). toString ()); res.setok (falso); regresar res; }}} Explicación detallada de la interfaz cliente de Jersey
1 interfaz de cliente
La creación de una instancia de cliente se construye a través de ClientBuilder. Por lo general, se usa una instancia de clientCig como parámetro. Si usamos Client Client = ClientBuilder.NewClient () para crear una instancia de cliente, crearemos una instancia de cliente cada vez, pero la instancia es un objeto de peso pesado. Por lo tanto, se recomienda utilizar la agrupación de conexión HTTP para administrar conexiones, en lugar de crear un objeto cliente cada vez que solicitemos. Para obtener métodos específicos de gestión del grupo de conexión, consulte el ejemplo de código anterior.
2 interfaz webTarget
La interfaz WebTarget es una interfaz que implementa el posicionamiento de recursos para clientes REST. A través de la interfaz WebTarget, podemos definir la dirección específica del recurso solicitado, los parámetros de consulta e información de tipo de medios, etc. Podemos completar la configuración de una instancia de Target web a través de una cadena de métodos, pero debe tenerse en cuenta que aunque el método de uso de WebTarget es muy similar a la cadena de métodos de StringBuffer, es esencialmente diferente. La cadena de métodos de WebTarget debe establecer el valor de retorno del método como un mango en el proceso posterior. ¿Qué quiere decir esto? Vea los siguientes ejemplos:
Ejemplo 1: Ejemplo de cadena de métodos StringBuffer
StringBuffer sb = new StringBuffer ("LCH"); sb.append ("hola"); sb.append ("mundo"); sb.append ("hola"). append ("mundo"); // Este método es el mismo que las dos líneas de código anteriores.Ejemplo 2: ejemplo de cadena de métodos webTarget
// Use una cadena de método de código de una línea para instanciar WebTarget WebTarget webTarget = Client.target ("http: // localhost: 8080"); webTarget.path ("/github/get/users/page") .QueryParam ("PageOffset", PageOffset) .QueryParam ("PageSize", PageSize) .QueryParam ("OrderColumn", OrderColumn); // Aquí está el uso de cadenas de métodos para instanciar WebTarget webTarget.path ("/github/get/users/page"); webTarget.QueryParam ("PageOffset", PageOffset); webTarget.QueryParam ("PageSize", PageSize); // Los resultados de los dos métodos de instancia anteriores son muy diferentes. El método de instanciación anterior está bien, no hay problema, pero el siguiente método de instanciación tiene problemas. En el siguiente método de instanciación, cada fila generará un objeto A // nuevo WebTarget. El WebTarget original no jugó ningún papel. Después de todo, las instancias de cada fila son diferentes. Si queremos instanciarlo en varias filas, debemos proporcionar un mango para la devolución de cada método. El método es el siguiente: WebTarget Target = Client.Target ("http: // localhost: 8080"); WebTarget pathTarget = target.path ("/github/get/users/page"); WebTarget paramTarget = pathTarget.QueryParam ("PageOffset", PageOffset); // Cuando lo use el último, use el último objeto de instancia de WebTarget 3 interfaz de invocación
La interfaz de invocación es una interfaz que inicia una solicitud al servidor REST después de completar la configuración de posicionamiento de recursos. La solicitud incluye dos métodos: sincronización y asíncrono. Está definido por la interfaz del constructor dentro de la interfaz de invocación. La interfaz del constructor hereda la interfaz de sincronización SyncinVoker. Los ejemplos de llamadas asincrónicas son los siguientes:
Future <resultsg <list <GitHubEntity>>> respuesta = invocationBuilder.async (). Get (genericType); if (respuesta.isdone ()) {return response.get (); } Invocation.Builder Interface Instance ejecuta las solicitudes Get and Post para enviar consultas y crea respectivamente. Por defecto, el tipo de retorno de la llamada del método HTTP es el tipo de respuesta, y también admite el valor de retorno del tipo genérico. En el ejemplo anterior, utilizamos una gran cantidad de genéricos, por lo que no explicaremos demasiado aquí.
Lo anterior es todo el contenido de este artículo. Espero que sea útil para el aprendizaje de todos y espero que todos apoyen más a Wulin.com.