이 기사는 저지 클라이언트를 사용하여 Spring Boot (RESTFUL) 서비스를 요청하고 다음과 같이 공유합니다.
Jersey Client 클라이언트 객체 인스턴스 캡슐화를받습니다.
@Service ( "JerseyPoolingClient") 공개 클래스 JerseyPoolingClientFactoryBean은 FactoryBean, 초기화 비안, 일회용 비안 { /*** 클라이언트 인터페이스는 나머지 클라이언트의 기본 인터페이스이며 REST 서버와 통신하는 데 사용됩니다. 클라이언트는 커넥터, 구문 분석기 등 클라이언트 통신의 바닥에 다양한 객체를 관리하는 헤비급 객체로 정의됩니다. 따라서 응용 프로그램에서 많은 수의 클라이언트 인스턴스를 생성하는 것이 좋습니다. 이것은 개발에 필요합니다. 또한이 인터페이스는 인스턴스를 닫아야합니다. 그렇지 않으면 메모리 누출*/ 개인 클라이언트 클라이언트가 발생합니다. / ** * 클라이언트의 최대 연결 수는 2000 */ private int maxtotal = 2000입니다. / *** 경로 당 기본 최대 연결 수*/ 개인 int defaultMaxPerroute = 1000; Private ClientConfig ClientConfig; public jerseypoolingClientFactoryBean () {} / *** 구성이있는 생성자* @param clientConfig* / public jerseypoolingClientFactoryBean (clientConfig ClientConfig) {this.clientConfig = clientConfig; } public JerseyPoolingClientFactoryBean (int maxtotal, int defaultmaxperroute) {this.maxtotal = maxtotal; this.defaultMaxPerroute = DefaultMaxPerroute; } / ** *주의 : * 세부 사항 : 컨테이너가 파괴 될 때 클라이언트 리소스 릴리스 * @author chhliu * / @override public void destrove () 예외 {this.client.close (); } / ** * *주의 : * 세부 사항 : Connection Pool 형식으로 클라이언트 객체를 초기화 * @Author chhliu * / @override public void after excepts {// clientConfig가있는 생성자가 사용되지 않으면 클래스의 인스턴스가 null이고 기본 구성 구성이 if (this.clientConfig == null)입니다. 새로운 ClientConfig (); // 연결 풀 관리 인스턴스,이 클래스는 Thread-Safe이며 다중 동시 작업을 지원합니다. PoolinghttpclientConnectionManager pcm = new PoolinghttpclientConnectionManager (); pcm.setmaxtotal (this.maxtotal); PCM.SetDefaultMaxPerroute (this.DefaultMaxPerroute); ClientConfig.property (apacheclientProperties.Connection_Manager, PCM); / * * Jersey를 사용하여 Spring Boot 서비스를 요청할 때 Spring Boot는 Jackson을 사용하여 기본적으로 JSON을 구문 분석하는 반면 Jersey는 Moxy를 사용하여 기본적으로 JSON을 구문 분석합니다. Jersey Client가 Spring Boot Service가 리소스를 요청하기를 원할 때,*이 차이는 서버와 클라이언트가 POJO를 다르게 변환하게하여 사로화 오류가 발생하여 고객의 구성 인스턴스에 Jackson 기능을 등록해야합니다.*/ clientConfig.register (JacksonFeature.class); // 구성 apache 커넥터를 사용하면 기본 커넥터는 httpurlConnector ClientConfig.connectorProvider (new ApacheConnectorProvider ())입니다. client = clientBuilder.newclient (clientConfig); } else {// 생성자에서 ClientConfig를 사용하여 클라이언트 개체 클라이언트 = ClientBuilder.NewClient (this.clientConfig)를 초기화합니다. }} /** *주의 : * 세부 사항 : 클라이언트 객체를 반환합니다. 객체가 null이면 기본 클라이언트를 작성하십시오 * @author chhliu */ @override public client getObject ()는 예외 {if (null == this.client) {return clientBuilder.newclient (); } is.client를 반환합니다. } / ** *주의 : * 세부 사항 : 클라이언트 객체의 유형을 가져옵니다 * @author chhliu * / @override public class <?> getObjecttype () {return (this.client == null? client.class : this.client.getClass ()); } / ** *주의 : * 세부 사항 : 클라이언트 객체가 싱글 톤이든, 싱글 톤의 기본값 * @author chhliu * / @override public boolean issingleton () {return true; }}Spring Boot Service의 캡슐화 요청 :
@Component ( "JerseyClient") 공개 클래스 JerseyClient {@Resource (name = "JerseyPoolingClient") 개인 클라이언트 클라이언트; /** *주의 : 세부 사항 : id * @author chhliu */public resultmsg <githubentity> getResponseByid (최종 문자열 ID)를 통해 개체를 쿼리합니다. invocation.builder invocationBuilder = webTarget.request (mediaType.Application_json); generictype <resultmsg <githubentity >> generictype = new GenericType <resultmsg <githubentity >> () {}; 응답 응답 = invocationBuilder.get (); if (response.getStatus () == 200) { /** readentity 메소드가 호출되면 프로그램이 자동으로 연결을 해제합니다. } else {resultmsg <githubentity> res = new resultmsg <githubentity> (); res.seterrorCode (String.Valueof (response.getStatus ()); res.seterrormsg (response.getStatusinfo (). toString ()); res.setok (false); 리턴 레스; }} / ** *주의 : * 세부 사항 : Paglination Query * @author chhliu * / public resultmsg <peager <githubentity >> getgithubwithpager (최종 정수 페이지 오프, 최종 정수 pageize, 최종 문자열 주문) {webtarget webtarget = client.target ( "http : // localhost : 8080") .path ( "/github/get/user/page") .queryparam ( "pageoffset", pageoffset) .queryparam ( "pagesize", pagesize) .queryparam ( "OrderColumn", OrderColumn); // 여기서 미디어 유형이 mediaType.application_json 인 경우 서비스의 해당 매개 변수는 @requestBody invoction.Builder invoctionBuilder = webTarget.Request (mediaType.Application_json)가 있어야합니다. generictepe <resultmsg <pager <githubentity >>>> generictype = new GenericType <resultmsg <pager <githubentity >>> () {}; 응답 응답 = invocationBuilder.get (); if (response.getStatus () == 200) {return response.readentity (genericType); } else {resultmsg <pager <githubentity >> res = new resultmsg <pager <githubentity >> (); res.seterrorCode (String.Valueof (response.getStatus ()); res.seterrormsg (response.getStatusinfo (). toString ()); res.setok (false); 리턴 레스; }} / ** *주의 : * 세부 사항 : 사용자 이름 * @author chhliu * / public resultmsg <list <githubentity >> getResponseByUserName (최종 문자열 사용자 이름)을 기반으로 쿼리 client.target ( "http : // localhost : 8080") .path ( "/github/get/users/"+username); invocation.builder invocationBuilder = webTarget.request (mediaType.Application_json); generictepe <resultmsg <list <githubentity >>> generictype = new GenericType <resultmsg <list <githubentity >>> () {}; 응답 응답 = invocationBuilder.get (); if (response.getStatus () == 200) {return response.readentity (genericType); } else {resultmsg <list <githubentity >>> res = new resultmsg <list <githubentity >> (); res.seterrorCode (String.Valueof (response.getStatus ()); res.seterrormsg (response.getStatusinfo (). toString ()); res.setok (false); 리턴 레스; }}/** *주의 : * 세부 사항 : Id * @author chhliu */public resultmsg <githubentity> deletebyId (최종 문자열 ID)에 따라 레코드를 삭제합니다. jsonProcessingException, ioException {webTarget target = client.target ( "http : // localhost : 8080"). generictype <resultmsg <githubentity >> generictype = new GenericType <resultmsg <githubentity >> () {}; 응답 응답 = target.request (). delete (); if (response.getStatus () == 200) {return response.readentity (genericType); } else {resultmsg <githubentity> res = new resultmsg <githubentity> (); res.seterrorCode (String.Valueof (response.getStatus ()); res.seterrormsg (response.getStatusinfo (). toString ()); res.setok (false); 리턴 레스; }}/** *주의 : * 세부 사항 : 레코드 업데이트 * @author chhliu */public resultmsg <githubentity> 업데이트 (최종 githubentity entity)는 JSONProcessingException, ioException {webTarget target = client.target ( "http : // localHost : 8080")을 던졌습니다. generictype <resultmsg <githubentity >> generictype = new GenericType <resultmsg <githubentity >> () {}; 응답 응답 = target.request (). buildput (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 (response.getStatus ()); res.seterrormsg (response.getStatusinfo (). toString ()); res.setok (false); 리턴 레스; }}/** *주의 : * 세부 사항 : 레코드 삽입 * @author chhliu */public resultmsg <githubentity> 저장 (최종 githubentity entity)은 jsonProcessingException, ioexception {webTarget target = client.target ( "http : // localhost : 8080"). generictype <resultmsg <githubentity >> generictype = new GenericType <resultmsg <githubentity >> () {}; 응답 응답 = 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 (response.getStatus ()); res.seterrormsg (response.getStatusinfo (). toString ()); res.setok (false); 리턴 레스; }}} 저지 클라이언트 인터페이스에 대한 자세한 설명
1 클라이언트 인터페이스
클라이언트 인스턴스 생성은 ClientBuilder를 통해 구성됩니다. 일반적으로 ClientConfig 인스턴스는 매개 변수로 사용됩니다. 클라이언트 클라이언트 = clientBuilder.NewClient ()를 사용하여 클라이언트 인스턴스를 생성하는 경우 매번 클라이언트 인스턴스를 생성하지만 인스턴스는 헤비급 객체입니다. 따라서 요청할 때마다 클라이언트 객체를 작성하는 대신 HTTP 연결 풀링을 사용하여 연결을 관리하는 것이 좋습니다. 특정 연결 풀 관리 방법은 위의 코드 예제를 참조하십시오.
2 WebTarget 인터페이스
WebTarget 인터페이스는 REST 클라이언트를위한 리소스 포지셔닝을 구현하는 인터페이스입니다. WebTarget 인터페이스를 통해 요청 된 자원, 쿼리 매개 변수 및 미디어 유형 정보 등의 특정 주소를 정의 할 수 있습니다. 메소드 체인을 통해 WebTarget 인스턴스의 구성을 완료 할 수 있지만 WebTarget의 사용 방법은 StringBuffer의 메소드 체인과 매우 유사하지만 본질적으로 다릅니다. WebTarget의 메소드 체인은 메소드의 리턴 값을 후속 프로세스의 핸들로 설정해야합니다. 이것이 무엇을 의미합니까? 다음 예제를 참조하십시오.
예 1 : StringBuffer 메소드 체인 예제
StringBuffer SB = New StringBuffer ( "LCH"); sb.append ( "Hello"); sb.append ( "세계"); sb.append ( "Hello"). Append ( "World"); //이 메소드는 위의 두 줄의 코드와 동일합니다.
예제 2 : WebTarget 메소드 체인 예제
// WebTarget WebTarget webTarget = client.target ( "http : // localhost : 8080")을 인스턴스화하기 위해 한 줄 코드 메소드 체인을 사용합니다. webtarget.path ( "/github/get/user/page") .queryparam ( "pageoffset", pageoffset) .queryparam ( "pagesize", pagesize) .queryparam ( "OrderColumn", OrderColumn); // 여기에 webtarget webtarget.path ( "/github/get/users/page")를 인스턴스화하기 위해 메소드 체인을 사용하는 것이 있습니다. webtarget.queryparam ( "pageoffset", pageoffset); webtarget.queryparam ( "pagesize", pagesize); // 위의 두 인스턴스화 방법의 결과는 매우 다릅니다. 위의 인스턴스화 방법은 정상이며 문제가 없지만 다음 인스턴스화 방법에는 문제가 있습니다. 다음 인스턴스화 방법에서 각 행은 // 새로운 webtarget 객체를 생성합니다. 원래 WebTarget은 어떤 역할도하지 않았습니다. 결국, 각 행의 인스턴스는 다릅니다. 여러 행으로 인스턴스화하려면 각 방법의 반환을위한 핸들을 제공해야합니다. 이 방법은 다음과 같습니다. webTarget target = client.target ( "http : // localhost : 8080"); webtarget pathtarget = target.path ( "/github/get/users/page"); webtarget paramtarget = pathtarget.queryparam ( "pageoffset", pageoffset); // 마지막으로 사용할 때 마지막 WebTarget 인스턴스 객체를 사용하십시오.
3 호출 인터페이스
호출 인터페이스는 리소스 포지셔닝 구성을 완료 한 후 REST 서버에 대한 요청을 시작하는 인터페이스입니다. 요청에는 동기화와 비동기식의 두 가지 방법이 포함됩니다. 호출 인터페이스 내부의 Builder 인터페이스에 의해 정의됩니다. Builder 인터페이스는 동기화 인터페이스 SyncIncinVoker를 상속합니다. 비동기 통화의 예는 다음과 같습니다.
Future <resultmsg <list <githubentity >>> response = invocationBuilder.async (). get (generictype); if (response.isdone ()) {return response.get (); } invocation.builder 인터페이스 인스턴스는 각각 쿼리 제출 및 생성 요청 get 및 post 요청을 실행합니다. 기본적으로 HTTP 메소드 호출의 반환 유형은 응답 유형이며 일반 유형의 반환 값도 지원합니다. 위의 예에서, 우리는 많은 수의 제네릭을 사용 했으므로 여기에 너무 많이 설명하지 않을 것입니다.
위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.