앞에 쓰십시오
이 기사는 Markdown 형식으로 작성되었습니다. 내가 이것을 처음으로 쓴 것은 이번이 처음입니다. 레이아웃이 약간 지저분해질 수 있으며, 당신이 그것을 용서할 수 있기를 바랍니다.
주로 리본을 사용하여 편안한 요청을하고, 다양한 방법의 사용을 테스트하고, 코드는 상대적으로 중복되어 초보자에게 더 적합하므로 분출을받는 것이 좋습니다. 감사합니다.
전제
참고 :이 기사에서는 스프링 부트 스타터 부모 버전을 1.5.9.Realease 이상으로 업그레이드해야합니다 (1.3.7. Release 버전에는 주석이 없습니다).
제안 : 각 마이크로 서비스 애플리케이션에는 고유 한 스프링 부트 마이븐-플러그 인 및 Maven-Compiler-Plugin이 있으며 JDK 컴파일 버전이 1.8임을 지정합니다. 사양 방법은 다음과 같습니다. pom.xml에 추가하십시오.
<빌드> <플러그인> <grugin> org.springframework.boot </groupId> <artifactid> Spring-Boot-Maven-Plugin </artifactid> </plugin> <groupid> org.apache.maven.plugins </groupid> <artifactid> </artifpiler- <source> 1.8 </source> <garget> 1.8 </target> </configuration> </plugin> </plugins> </build>
테스트 프로젝트 구성
유레카 등록 센터 : 참조 등록 센터 설립 서비스 제공 업체 : 참조 등록 서비스 제공 업체
리본 소비자 : 참조 서비스 발견 및 소비
프로젝트가 구축 된 후이 자습서에 언급 된 구성 호스트 파일을 따르십시오.
프로젝트의 요청 매핑이 동일하지 않도록하기 위해 모든 컨트롤러 클래스 (서비스 제공 업체 및 소비자)를 삭제합니다. 다음으로, 나는 각각의 편안한 방법을 모든 사람이 볼 수 있도록 수업에 캡슐화 할 것입니다.
요청 받으십시오
getforentity :이 방법에는 세 가지 과부하 양식이 있습니다.
참고 :이 메소드는 래퍼 객체 응답 entity <t>를 반환합니다. 여기서 t는 유형으로 전달되는 응답 유형입니다. 리턴 유형을 얻으려면이 래퍼 객체의 getbody () 메소드를 사용해야합니다.
GetForObject :이 방법에는 세 가지 과부하 형 양식이 있으며 이는 GetForentity 방법과 동일합니다.
참고 :이 메소드에서 반환 된 객체 유형은 유형에 전달 된 ResponseType입니다.
테스트의 편의를 위해 테스트의 편의를 위해 서비스 제공 업체와 서비스 소비자에 동일한 사용자 클래스가 제공됩니다.
패키지 com.cnblogs.hellxz;/** * 테스트를위한 pojo */public class user {private string name; 개인 문자열 섹스; 개인 문자열 전화; public user () {} public user (문자열 이름, 문자열 섹스, 문자열 전화) {this.name = name; this.sex = 섹스; this.phone = 전화; } public String toString () {return "user : {" + "이름 :" + name + "," + "sex :" + sex + "," + "폰 :" + 폰 + "}"; } public String getName () {return name; } public void setName (문자열 이름) {this.name = 이름; } public String getSex () {return sex; } public void setsex (String sex) {this.sex = sex; } public String getPhone () {반환 전화; } public void setphone (String Phone) {this.phone = 전화; }}아래는 서비스 제공 업체에서 getRequestController를 만듭니다
package com.cnblogs.hellxz; import org.apache.log4j.logger; import org.springframework.bean.bean.annotation.AntOntation.AUTOWERED; import org.springframework.cloud.cloud.serviceInstance; import org.springframework.cloud.client.discovery.discovery.discyclient; org.springframework.web.bind.annotation. // Discovery Client Private Final Logger Logger = Logger.getLogger (GetRequestController.class); /** * 스트레이트 테스트 이동 */@getMapping (value = "/hello") public String hello () {// 서비스 인스턴스를 가져 오십시오. 기능은 콘솔 나중에 ServiceInstance ServiceInstance = client.getLocalServiceInstance ()의 효과를 표시하는 것입니다. logger.info ( "/hello host :"+serviceInstance.gethost ()+"service_id :"+serviceInstance.getServiceId ()); "안녕하세요"를 반환합니다. }/** * 매개 변수 테스트 */@getMapping (value = "/greet/{dd}") public string greet (@pathvariable String dd) {serviceInstance serviceInstance = client.getLocalServiceInstance (); logger.info ( "/hello host :"+serviceInstance.gethost ()+"service_id :"+serviceInstance.getServiceId ()); "Hello"+DD를 반환합니다. }/*** 테스트 객체를 반환*/@getMapping ( "/user") public user getUser () {serviceInstance serviceInstance = client.getLocalServiceInstance (); logger.info ( "/user"+serviceInstance.gethost ()+"포트 :"+serviceInstance.getport ()+"serviceInstanceId :"+serviceInstance.getServiceId ()); 새 사용자를 반환합니다 ( "Hellxz", "Male", "123456789"); }/*** 이름에 따라 객체를 반환하고 데이터베이스 검색 작업이 여기에서 시뮬레이션됩니다*/@getMapping ( "/user/{name}") 공개 사용자 getUserSelect (@PathVariable String Name) {serviceInstance serviceInstance = client.getLocalServiceInstance (); logger.info ( "/user"+serviceInstance.gethost ()+"포트 :"+serviceInstance.getport ()+"serviceInstanceId :"+serviceInstance.getServiceId ()); if (name.isempty ()) {return new user (); } else if (name.equals ( "hellxz")) {return new user ( "hellxz", "male", "123456789"); } else {return new user ( "Random User", "Male", "987654321"); }}}다음으로 서비스 소비자 프로젝트에서 getRequestController를 만듭니다.
package com.cnblogs.hellxz; import org.apache.log4j.logger; import org.springframework.bean.beans.annotation.autowired; import org.springframework.http.respontity; import org.springframework.web.bind.annotation.*; org.springframework.web.client.resttemplate; import org.springframework.web.util.uricomponents; import org.sprameframework.web.util.uricomponentsbuilder; import java.net.uri; import java.util.hashmap; import java.util. * @Description : 리본 소비자 응용 프로그램 컨트롤러, 요청 받기 * @Date : 2018/4/16 15:54 */ @restControllerPublic 클래스 getRerequestController {private logger = logger.getLogger (getRequestController.class); @autowired // resttemplate를 주입 개인 RestTemplate RestTemplate; /** * responsentity <t> getforentity (String URL, Class <T> responseType) * t getBody () 다음 방법은 동일합니다 */@getMapping (value = "/entity/noparam") 공개 문자열 noparamgetforentity () {// 여기에서 댓글을 달아주지 않았기 때문에 여기에서 댓글을 달아주지 않을 것이기 때문에 여기에 댓글을 달았습니다. // return resttemplate.getForentity ( "http : // localhost : 8080/hello", String.class) .getBody (); // resttemplate를 사용하여 마이크로 서비스 인터페이스를 호출하십시오. return resttemplate.getforentity ( "http : // hello-service/hello", string.class) .getbody (); }/** * responsentity <t> getforentity (문자열 URL, 클래스 <T> responseType, Object ... urivariables) */@getMapping ( "/entity/type") 공개 사용자 getForentityIndifyByType () {// 매개 변수 응답을 전달하지 않고 지정된 유형의 결과를 반환합니다. user.class); 사용자 body = entity.getBody (); logger.info ( "사용자 :"+body); 반환 몸; // 위는 // return resttemplate.getForentity ( "http : // hello-service/user", user.class) .getBody (); }/** * 응답 중단 <t> getforentity (문자열 URL, 클래스 <T> ResponseType, Object ... urivariables) * 자리 표시 자를 사용하여 매개 변수를 대체하고 문자열을 사용하여 문자열을 사용하여 */@getMapping (value = "/entity")을 구현하지 않으셨습니까? 그렇다면 @PathVariable을 사용하십시오. 그렇지 않으면 @RequestParam public string getforentityByQuestionMarkParam (@requestParam ( "name") 문자열 이름) {// 메인 테스트 getEntity 메소드, 여기서 테스트는 직접 RETTEMPLATE를 전달합니다. }/*** getforentity 메소드는 내부적으로 맵을 추출하고 자리 표시 자 키의 값은 매개 변수* responsentity (문자열 URL, 클래스 <T> ResponseType, map <string,?> urivariables)로 URL로 백필입니다. @RequestParam public String getforentityBymap (@PathVariable ( "name") 문자열 이름) {// 메인 테스트 getEntity 메소드, 여기서 맵 매개 변수 맵 <string, string> reqmap = new Hashmap (); reqmap.put ( "이름", 이름); resttemplate.getforentity ( "http : // hello-service/greet/{name}", string.class, reqmap) .getBody (); }/** * responsentity <t> getForObject (uri url, class <t> responseType) */@getMapping ( "/entity/uri") public string getforentityByuri () {// URI를 사용하여 인수를 전달하고 uricomponents uricomponents = 액세스합니다. URICOMPONENTSBUILDER.FROMURISTRING ( "http : // hello-service/greet/{name}") .build (). expand ( "laozhang") .encde (); uri uri = uricomponents.touri (); resttemplate.getforentity (uri, string.class) .getBody (); }/** * t getForObject (String URL, class <T> responseType) */@getMapping ( "/Object") 공개 사용자 getForObjectWithNoparam () {// getforentity 메소드와 비교하여 객체를 얻는 것은 lettemplate를 호출 할 수 있습니다. }/** * t getForObject (String URL, class <T> responseType, map <string,?> urivariables) */@getMapping ( "/object/map") 공개 사용자 getForObjectBymap () {// 매개 변수를 사용하여 <string, string> parammap = new HashMap <> (); Parammap.put ( "이름", "hellxz"); resttemplate.getForObject ( "http : // hello-service/user", user.class, parammap); }/** * t getForObject (String URL, Class <T> ResponseType, Object ... urivariables) */@getMapping ( "/object/param/{name}") 공개 사용자 getForObjectByparam (@PathVariable String Name) {return rettemplate.getForObject ( "http : // hello-service/user/user/user/user/user/user}"; }/** * t getForObject (uri url, class <t> responseType) */@getMapping ( "/object/uri/{name}") 공개 사용자 getForObjectByUri (@PathVariable String name) {uricomponents = uricomponentsBuilder.fromUristring ( "http : // hello service/user/userovice/userovice/uservice/useverring. .build (). Expand (name) .encode (); uri uri = uricomponents.touri (); resttemplate.getForObject (uri, user.class); }}먼저 등록 센터를 시작한 다음 소비자가 제공 한 인터페이스에 액세스하여 테스트하십시오. 이것들은 모두 나에 의해 실제로 운영되므로 여기에 테스트를 작성하지 않을 것입니다.
사후 요청
사후 요청과 GET 요청 모두 *forentity 및 *forobject 메소드를 가지고 있으며, 여기서 매개 변수 목록은 다소 다릅니다. 이 두 가지 방법 외에도 포스트 포스트 포스트로 위치가있는 방법이 있습니다. 여기서 포스트 포스트는 자원을 사후 요청으로 제출하고 새로운 리소스의 URI를 반환합니다.
포스트 퓨처 :이 방법에는 세 가지 과부하 형식이 있습니다.
참고 :이 메소드는 래퍼 객체 응답 entity <t>를 반환합니다. 여기서 t는 유형으로 전달되는 응답 유형입니다. 리턴 유형을 얻으려면이 래퍼 객체의 getbody () 메소드를 사용해야합니다.
PostForObject :이 방법에는 세 가지 오버로드 양식이 있습니다.
참고 :이 메소드에서 반환 된 객체 유형은 유형에 전달 된 ResponseType입니다.
포스트 포스트 :이 방법에는 세 가지 과부하 양식이 있습니다.
참고 :이 메소드는 새로운 리소스의 URI를 반환합니다. getforentity, getforobject, postforentity 및 post -forobject 메소드의 차이점은 반환 유형이 URI이기 때문에이 메소드에서 리턴 유형을 지정할 필요가 없다는 것입니다. 여전히 자리 표시자가 객체를 통해 인수를 전달해야합니다 ... urivariables, map <string,?> urivariables. 코드의 포스트 포지티브 부분을 참조하십시오.
이전 방식으로, 우리는 서비스 제공 업체와 소비자를 각각 제공하는 프로젝트에서 PostrequestControllers를 만들었습니다.
다음 서비스 PostRequestController 코드는 다음과 같습니다.
package com.shunneng.springcloudhelloworld; import org.apache.log4j.logger; import org.springframework.web.bind.annotation.*; import org.springframework.web.util.uricomponents; import org.springframework.weeb.ulecomponentsbuilder; java.net.uri;/** * @author : hellxz * @description : * @date : 2018/4/18 10:21 */ @restControllerPublic 클래스 postrequestController {private logger = logger.getLogger (postrequestController.class); /*** 물체를 받고 다시 반환합니다. postforentity/postforobject 메소드는 일반적입니다*/@postmapping ( "/user") public user returnuserbypost (@requestbody user) {logger.info ( "/us interface"+user); if (user == null) 새 사용자를 반환합니다 ( "이것은 빈 객체", "", ""); 리턴 사용자; }/** * postforentity 메소드의 매개 변수를 테스트하면 출력 */@postmapping ( "/user/{str}") 공개 사용자 returnUserBypost (@PathVariable String, @RequestBody 사용자) {logger.info ( "/user/someparam 인터페이스 이름 :"+str+""+user); if (user == null) 새 사용자를 반환합니다 ( "이것은 빈 객체", "", ""); 리턴 사용자; }/** * postforlocation 메소드 */@postmapping ( "/location") public uri returnUri (@requestbody user user) {// 여기서 URL을 시뮬레이션하면 URICOMPONENTS URICOMPONENTS가 아닐 수 있습니다. .Build (). Expand (user) .encode (); uri touri = uricomponents.touri (); // 문제가 무엇인지 모르겠습니다. 분명히 생성되었지만 Logger.info ( "/location uri :"+touri); 반환 투어; }}소비자 PostRequestController 코드 :
package com.cnblogs.hellxz; import org.apache.log4j.logger; import org.springframework.bean.beans.annotation.autowired; import org.springframework.http.responessentity; import org.springframework.web.bind.annotation.postmapping; org.springframework.web.bind.annotation.restcontroller; import org.springframework.web.client.resttemplate; import org.springframework.web.util.uricomponents; import org.spramework.web.util.uricomponentsbuilder; : hellxz * @description : 리본 소비자 게시물 요청 컨트롤러 * @Date : 2018/4/18 9:47 */ @restControllerPublic 클래스 postrequestController {private logger = logger.getLogger (postrequestController.class); @autowired 개인 resttemplate resttemplate; /** * 응답 중단 <t> postforentity (문자열 URL, 객체 요청, 클래스 <t> responseType) * 매개 변수 URL이 언급되지 않았습니다. 객체 요청이 httpentity 객체가 아닌 경우, 자동으로 httpentity 객체로 변환되고 완전한 신체로 취급됩니다. * httpentity 객체 인 경우 본문으로 직접 처리되며 헤더 컨텐츠가 포함됩니다. * 아래의 재 작성 방법에 대해서는 이야기하지 않습니다. 사용법은 getforentity와 거의 동일합니다. 단순한 게시물 객체 인 경우 객체가없는 메소드를 사용하십시오 ... 변수 또는 맵 변수. * postforentity (문자열 URL, 객체 요청, 클래스 <T> responseType, object ... urivariables) * postforentity (문자열 URL, 객체 요청, 클래스 <t> responseType, map <string,?> urivariables) * * 여기서 우리는 내가 자세히 설명한 함정에 대해 이야기 할 것입니다. 자리 표시 자를 사용하여 게시물에서 요청한 URL에서 매개 변수를 전달하고 URL에 자리 표시자가 사용되지 않으면 마지막으로 통과 한 매개 변수는 유효하지 않습니다! * 2. 메소드의 객체 요청 객체가 서비스 제공 업체의 수신 매개 변수와 동일한 유형을 갖는 경우 서비스 제공 업체는 @requestBody를 사용하여 매개 변수를 수신하면됩니다. * 3. 둘 다 사용되면 이것은 더 흥미 롭습니다. @PathVariable 주석을 통해 URI에서 매개 변수를 수신해야하며, 필드에 따라 매개 변수를 수신하려면 @RequestBody를 수신하려면 @RequestBody가 필요합니다! * 4. 오류를보고하면 위에서 쓴 세 가지 항목을 자세히 살펴보고 서비스 제공 업체의 매개 변수 및 주석 사용에주의를 기울이십시오. */ @postmapping ( "/ entity") public user postforentity () {user user = new user ( "hellxz1", "1", "678912345"); ResponseNtity <userity = entity = resttemplate.postforentity ( "http : // hello-service/user/{str}", user, user.class, "테스트 매개 변수"); 사용자 body = entity.getBody (); // 모든 resttemplate.*forentity 메소드는 래퍼 클래스이고 본문은 반환 유형 객체 리턴 바디입니다. }/*** URI와 함께 매개 변수를 전달하면 테스트 결과가 서비스 제공 업체의 터미널* responsentity <t> postforentity (uri url, 객체 요청, 클래스 <t> responseType)*/@postmapping ( "/entity/uri") 공개 사용자 postforentityByUri () {user user = new user = "1", "678921211; // 여기서 우리는 URL을 URI로 변환하고 매개 변수가 추가되지 않음 Uricomponents uricomponents = uricomponentsBuilder.fromUristring ( "http : // hello-service/user") .build (). encode (); uri touri = uricomponents.touri (); // 사용자를 사용하여 매개 변수를 전달합니다. 사용자 객체 = resttemplate.postForObject (wori, user, user.class); 리턴 객체; } /*** 여기에서 postforobject 메소드를 테스트 할 때주의를 기울여야하는 매개 변수는 위의 방법에 설명되어 있습니다. 차이점은 당신이 getbody가 필요하지 않기 때문에 여기에 자세히 설명하지 않을 것입니다 * postforObject (문자열 URL, 객체 요청, 클래스 <T> responseType, object ... urivariables) * postForObject (문자열 URL, 객체 요청, 클래스 <T> 응답, 개체 ... urivariables) * postforObject (urivaribles) * postForObject (urivaribles) */ urivarible, map <string,? @PostMapping ( "/Object") public user postForObject () {user user = new user ( "hellxz2", "1", "123654987"); // 여기서 URL은 1을 전달하여 서버 프로젝트에서 인터페이스를 호출합니다. 사용자 응답 : resttemplate.postForObject ( "http : // hello-service/user/1", user, user.class); 반응 응답 바디; } /*** 다른 유형의 사후 요청이 있습니다 : Postforlocation. 여기에는 세 가지 과부하가 있습니다. 리턴 유형을 지정하지 않는 것 외에도 사용법은 동일하고 리턴 유형은 모두 URI이므로 * PostforLocation (문자열 URL, 객체 요청, 개체 ... Urivariable) * PostForLocation (문자열 URL, 객체 요청, MAP <String,?> urivariables (uri url, Object Request) */ @postmapping ( "/ forial")). = 새 사용자 ( "hellxz3", "1", "987654321"); uri uri = resttemplate.postforlocation ( "http : // hello-service/location", user); // 왜 비어 있는지 모르겠습니다. 이 방법은 참조 용입니다. 상황이 무엇인지 알면 Logger.info를 변경하기 위해 돌아올 것입니다 ( "/location uri :"+uri); 반환 URI; }}요청 && 삭제 요청을 넣습니다
PUT 요청은 GET 및 Post 요청 방법보다 간단합니다. PUT 요청의 리턴 유형을 지정할 필요가 없으며 물론 반환 값이 없습니다. 또한 세 가지 유형의 오버로드입니다. 기본적으로 이전에 작성된 것과 동일합니다. 여기서 더 말하고 싶지 않습니다. 삭제 요청과 PUT 요청에는 리턴 값이 없습니다. 여기에 구체적으로 작성해도 문제가되지 않습니다. 이 두 요청의 방법은 별도로 나열됩니다. 코드는 클래스로 작성됩니다.
PUT 요청 방법은 다음과 같습니다.
삭제 요청 방법은 다음과 같습니다.
PutandDeleteRequestController를 제공자 프로젝트에 추가하십시오. 코드는 다음과 같습니다.
package com.cnblogs.hellxz; import org.apache.log4j.logger; import org.springframework.web.bind.annotation. *;/** * @author : hellxz * @desprionpication : 서비스 제공 업체 Put & Delete Request Controller * @date : 2018/4/19 14:11 */ @rostcontrollerpublicpublicpublicpublicpublic 폰트 Classonterpublic 폰트 폰트 폰트 컨트롤러 삭제 및 삭제. {private logger logger = logger.getLogger (putandleteRequestController.class); @putmapping ( "/put") public void put (@requestbody user) {logger.info ( "/put"+user); } @deletemapping ( "/delete/{id}") public void delete (@pathvariable long id) {logger.info ( "/delete id :"+id); }}PutandDeleteRequestController를 제공자 프로젝트에 추가하십시오. 코드는 다음과 같습니다.
com.cnblogs.hellxz; import org.apache.log4j.logger; import org.springframework.bean.beans.annotation.annotation.annotation.annotation.annotation.annotation.annotation.annotation.annotation.annotation.annotation.annotation.annotation.annotation.annotation.annotation.annotation.AntOntation. import org.spramframework.web.bind.annotation. 요청, 삭제 요청, 과부하 매개 변수는 기본적으로 위의 데모와 동일하며, * @Date : 2018/4/19 13:43 */ @restControllerPublic 클래스 PutrequestController {private logger = logger.getLogger (postrequestController.class); @autowired 개인 resttemplate resttemplate; /*** PUT 요청 예제, 일반적으로 PUT 요청은 주로 수정으로 사용됩니다*/@putMapping ( "/put") public void put (@requestbody user) {resttemplate.put ( "http : // hello-service/put", user); }/*** 요청 예제 삭제 예 : "/del/{id}") public void delete (@pathvariable long id) {resttemplate.delete ( "http : // hello-service/delete/{1}", id); }}결론
이 블로그 게시물은 Markdown을 사용하여 작성되었습니다. 코드 블록에 일련 번호와 코드 함수를 접는 방법을 모르겠습니다. 이것은 좋은 기사는 아니지만 거의 이틀 동안이 블로그 게시물을 작성하고 있습니다. 좋은 제안이 있으시면 자유롭게 의견과 교환하십시오.
위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.