Este artigo apresenta o uso do cliente Jersey para solicitar o serviço Spring Boot (RESTful) e o compartilha com você, como segue:
O cliente Jersey recebe o encapsulamento da instância do objeto do cliente:
@Service ("JerseypoolingClient") Classe pública JerseypoolingClientFactoryBean implementa a FactoryBean <Client>, InitializandoBean, DisposableBean { /*** A interface do cliente é a interface básica do cliente restante e é usado para se comunicar com o servidor restante. O cliente é definido como um objeto pesado que gerencia os vários objetos na parte inferior da comunicação do cliente, como conectores, analisadores etc. Portanto, não é recomendável gerar um grande número de instâncias do cliente no aplicativo. Isso é necessário no desenvolvimento. Além disso, essa interface exige que a instância seja fechada; caso contrário, causará vazamento de memória*/ cliente privado cliente; / ** * O número máximo de conexões para um cliente, o padrão é 2000 */ privado int maxtotal = 2000; / *** O número máximo padrão de conexões por rota*/ private int defaultMaxPerroute = 1000; private clientconfig clientconfig; public jerseypoolingClientFactoryBean () {} / *** Construtor com configuração* @param clientConfig* / public jerseypoolingClientFactoryBean (clientConfig clientConfig) {this.clientConfig = clientConfig; } public jerseypoolingClientFactoryBean (int maxtotal, int defaultMaxPerRoute) {this.maxtotal = maxtotal; this.DefaultMaxPerRoute = defaultMaxPerRoute; } / ** * Atenção: * Detalhes: Libere os recursos do cliente quando o contêiner é destruído * @Author chhliu * / @Override public void Destroy () lança exceção {this.client.close (); } / ** * * Atenção: * Detalhes: Inicialize o objeto do cliente na forma de um pool de conexão * @author chhliu * / @Override public void depoisPropertiEsset () lança exceção {// se o consultor) não é usado. novo clientconfig (); // Instância de gerenciamento do pool de conexão, esta classe é segura para threads e suporta várias operações simultâneas poolinghttpclientConnectionManager pcm = new PoolingHttpClientConnectionManager (); pcm.Setmaxtotal (this.maxtotal); PCM.SetDefaultMaxPerRoute (this.defaultMaxPerRoute); clientconfig.property (apacheclientproperties.connection_manager, pcm); / * * Ao usar a Jersey para solicitar o Spring Boot Service, a Spring Boot usa Jackson para analisar o JSON por padrão *, enquanto Jersey usa Moxy para analisar o JSON por padrão. Quando o cliente da Jersey deseja que o Spring Boot Service solicite recursos,* essa diferença fará com que o servidor e o cliente convertem o POJO de maneira diferente, resultando em erros de deserialização*, portanto, você precisa registrar o recurso Jackson na instância de configuração do cliente aqui*/ clientconfig.register (JacksonFeature.class); // Use o conector Apache de configuração, o conector padrão é httpurlconnector clientConfig.ConnectorProvider (new ApacheconConectorProvider ()); client = clientbuilder.newClient (clientconfig); } else {// use o clientConfig no construtor para inicializar o cliente cliente client = clientbuilder.newClient (this.clientConfig); }} /** * Atenção: * Detalhes: retorna o objeto cliente. Se o objeto for nulo, crie um cliente padrão * @Author chhliu */ @Override public client getObject () lança exceção {if (null == this.client) {return clientbuilder.newclient (); } retorne este.client; } / ** * Atenção: * Detalhes: obtenha o tipo de objeto cliente * @author chhliu * / @Override public class <?> getObjectType () {return (this.client == null? client.class: this.client.getclass ()); } / ** * Atenção: * Detalhes: se o objeto cliente é um singleton, padrão para um singleton * @author chhliu * / @Override public boolean iSsingleton () {return true; }}Solicitando o encapsulamento do serviço de inicialização da primavera:
@Component ("JerseyClient") Classe pública JerseyClient {@Resource (name = "JerseypoolingClient") Cliente privado; /** * Atenção: * Detalhes: Consulte o objeto através da ID * @Author chhliu */public ResultMsg <Githubentity> getResponseById (Final String ID) lança JSONProcessingException, IoException {WebTarget. Invocation.Builder InvocationBuilder = webtarget.request (mediatype.application_json); Generictype <resultadomsg <githubentity>> generictype = new generictype <resultadomsg <Githubentity>> () {}; Resposta da resposta = InvocationBuilder.get (); Se (Response.getStatus () == 200) { /** Quando o método ReadEntity for chamado, o programa liberará automaticamente a conexão* Mesmo se o método de leitura não for chamado e o objeto de tipo genérico for retornado diretamente, a camada subjacente ainda liberará a conexão* / resposta de retorno.readentity (generictype); } else {resultmsg <githubentity> res = new Resultmsg <githubentity> (); Res.SterrorCode (String.ValueOf (Response.getStatus ())); res.SterRormsg (Response.getStatusInfo (). ToString ()); res.setok (false); retornar res; }} / ** * Atenção: * Detalhes: Query de paginação * @Author chhliu * / public ResultMsg <Pager <Githubentity>> getGithubWithPager (Inteiro final Pageoffset, Final Integer Pagesize, String final OrderColumn) {webtargettetget = client.target ("http: // localhost: 8080") .path ("/github/get/users/page") .QueryParam ("Pageoffset", Pageoffset) .QueryParam ("Pagesize", Pagesize) .QueryParam ("OrderColumn", OrderColumn); // Observe que, se o tipo de mídia aqui for mediatype.application_json, o parâmetro correspondente no serviço deve ser precedido por @Requestbody Invocation.Builder InvocationBuilder = webtarget.request (mediatype.application_json); Generictype <resultadomsg <pager <githubentity>>>> generictype = new GenericType <resultadomsg <pager <githubentity>>> () {}; Resposta da resposta = InvocationBuilder.get (); if (Response.getStatus () == 200) {return Response.readEntity (generictype); } else {resultadomsg <pager <githubentity>> res = new Resultmsg <pager <githubentity>> (); Res.SterrorCode (String.ValueOf (Response.getStatus ())); res.SterRormsg (Response.getStatusInfo (). ToString ()); res.setok (false); retornar res; }} / ** * Atenção: * Detalhes: Query com base no nome de usuário * @author chhliu * / public Resultmsg <list <Githubentity>> getResponsebyusername (string final username) lança JSONProcessingException, IoException {WebTargetGetGet = client.target ("http: // localhost: 8080") .path ("/github/get/users/"+nome de usuário); Invocation.Builder InvocationBuilder = webtarget.request (mediatype.application_json); Generictype <resultadomsg <list <githubentity>>> generictype = new Generictype <resultadomsg <list <githubentity>>> () {}; Resposta da resposta = InvocationBuilder.get (); if (Response.getStatus () == 200) {return Response.readEntity (generictype); } else {resultadomsg <list <githubentity>>> res = new Resultmsg <List <Githubentity>> (); Res.SterrorCode (String.ValueOf (Response.getStatus ())); res.SterRormsg (Response.getStatusInfo (). ToString ()); res.setok (false); retornar res; }}/** * Atenção: * Detalhes: Exclua um registro baseado em id * @author chhliu */public ResultMsg <Githubentity> DeletebyId (Final String ID) lança jsonProcessingException, ioexception {webTarget Target = clientgget ("htttp: // localhost: 8080" 8080 "8080" 80n) Generictype <resultadomsg <githubentity>> generictype = new generictype <resultadomsg <Githubentity>> () {}; Resposta resposta = Target.Request (). Delete (); if (Response.getStatus () == 200) {return Response.readEntity (generictype); } else {resultmsg <githubentity> res = new Resultmsg <githubentity> (); Res.SterrorCode (String.ValueOf (Response.getStatus ())); res.SterRormsg (Response.getStatusInfo (). ToString ()); res.setok (false); retornar res; }}/** * Atenção: * Detalhes: Atualize um registro * @Author chhliu */public ResultMsg <Githubentity> Update (entidade final da githubentidade) lança JSONProcessingException, ioException {WebTarget Target = client.target ("http: // localhost: 808"). Generictype <resultadomsg <githubentity>> generictype = new generictype <resultadomsg <Githubentity>> () {}; Resposta resposta = Target.request (). Buildput (entity.entity (entidade, mediatype.application_json)). Invoke (); if (Response.getStatus () == 200) {return Response.readEntity (generictype); } else {resultmsg <githubentity> res = new Resultmsg <githubentity> (); Res.SterrorCode (String.ValueOf (Response.getStatus ())); res.SterRormsg (Response.getStatusInfo (). ToString ()); res.setok (false); retornar res; }}/** * Atenção: * Detalhes: Insira um registro * @author chhliu */public ResultMsg <Githubentity> salvar (entidade final da githubentity) lança jsonprocessingException, ioexception {webtarget alvo = client.target ("http: // localHost: 8080"). Generictype <resultadomsg <githubentity>> generictype = new generictype <resultadomsg <Githubentity>> () {}; Resposta resposta = Target.request (). BuildPost (entity.entity (entidade, mediatype.application_json)). Invoke (); if (Response.getStatus () == 200) {return Response.readEntity (generictype); } else {resultmsg <githubentity> res = new Resultmsg <githubentity> (); Res.SterrorCode (String.ValueOf (Response.getStatus ())); res.SterRormsg (Response.getStatusInfo (). ToString ()); res.setok (false); retornar res; }}} Explicação detalhada da interface do cliente Jersey
1 interface do cliente
Criar uma instância do cliente é construída através do cliente -construtor. Geralmente, uma instância do clienteconfig é usada como um parâmetro. Se usarmos o cliente client = clientbuilder.newclient () para criar uma instância do cliente, criaremos uma instância do cliente sempre, mas a instância é um objeto pesado. Portanto, é recomendável usar o pool de conexões HTTP para gerenciar conexões, em vez de criar um objeto cliente toda vez que solicitarmos. Para métodos específicos de gerenciamento de pool de conexão, consulte o exemplo de código acima.
2 interface webtarget
A interface do WebTarget é uma interface que implementa o posicionamento de recursos para clientes de repouso. Através da interface da WebTarget, podemos definir o endereço específico do recurso solicitado, parâmetros de consulta e informações do tipo de mídia etc. Podemos concluir a configuração de uma instância do WebTarget através de uma cadeia de métodos, mas deve -se notar que, embora o método de uso do WebTarget seja muito semelhante à cadeia de rumbuffer, é essencialmente diferente. A cadeia de métodos do WebTarget deve definir o valor de retorno do método como um identificador para o processo subsequente. O que isto significa? Veja os seguintes exemplos:
Exemplo 1: Exemplo de cadeia de método de stringbuffer
StringBuffer sb = new StringBuffer ("LCH"); sb.append ("hello"); sb.append ("mundo"); sb.append ("Hello"). Appender ("World"); // Este método é o mesmo que as duas linhas de código acima.Exemplo 2: Exemplo de cadeia de métodos da WebTarget
// Use uma cadeia de métodos de código de uma linha para instanciar o webtarget webtarget instanciado WebTarget = client.target ("http: // localhost: 8080"); webtarget.path ("/github/get/users/page") .QueryParam ("PageOffSet", Pageoffset) .QueryParam ("PageSize", PageSize) .QueryParam ("OrderColumn", OrderColumn); // Aqui está o uso de cadeias de métodos para instanciar o webtargettarget.path ("/github/get/users/page"); webtarget.QueryParam ("PageOffSet", PageOffSet); webtarget.QueryParam ("PageSize", PageSize); // Os resultados dos dois métodos de instanciação acima são muito diferentes. O método de instanciação acima é bom, não há problema, mas o método de instanciação a seguir tem problemas. No método de instanciação a seguir, cada linha gerará um // novo objeto WebTarget. O WebTarget original não desempenhou nenhum papel. Afinal, as instâncias de cada linha são diferentes. Se queremos instanciá -lo em várias linhas, devemos fornecer uma alça para o retorno de cada método. O método é o seguinte: WebTarget Target = client.target ("http: // localhost: 8080"); Webtarget pathtarget = Target.path ("/github/get/users/página"); WebTarget paramTarget = PathTarget.QueryParam ("PageOffSet", PageOffSet); // Ao usá -lo por último, use o último objeto de instância da WebTarget 3 Interface de invocação
A interface de invocação é uma interface que inicia uma solicitação para o servidor REST após concluir a configuração de posicionamento de recursos. A solicitação inclui dois métodos: sincronização e assíncrono. É definido pela interface do construtor dentro da interface de invocação. A interface do construtor herda a interface de sincronização SyncinVoker. Os exemplos de chamadas assíncronas são as seguintes:
Future <ResultMsg <List <Githubentity>>> Resposta = InvocationBuilder.async (). Get (generictype); if (Response.isdone ()) {return Response.get (); } A instância da Invocation.Builder Interface Executa solicitações GET e POST para enviar consultas e criar, respectivamente. Por padrão, o tipo de retorno da chamada do método HTTP é o tipo de resposta e também suporta o valor de retorno do tipo genérico. No exemplo acima, usamos um grande número de genéricos, por isso não explicaremos muito aqui.
O exposto acima é todo o conteúdo deste artigo. Espero que seja útil para o aprendizado de todos e espero que todos apoiem mais o wulin.com.