이 기사는 Spring Boot의 모범 사례를 소개하여 REST 인터페이스를 개발하고 다음과 같이 공유합니다.
HTTP 동사는 SQL 명령에 해당합니다
얻다
서버에서 리소스를 얻고 하나 이상의 리소스를 얻고 서버에서 모든 사용자 정보를 얻고 /사용자 /ID, 지정된 ID를 얻고 지정된 ID의 사용자 정보를 얻을 수 있습니다.
우편
SQL 명령의 CreatePost /사용자에 해당하는 서버에서 새 리소스를 작성하여 새 사용자를 만듭니다.
놓다
서버에서 리소스를 업데이트하면 클라이언트가 SQL 명령의 업데이트 /사용자 /ID에 해당하는 변경된 완전한 리소스를 제공하여 지정된 ID로 사용자의 모든 정보를 업데이트합니다.
삭제
서버에서 리소스를 삭제하고 SQL 명령에서 DeletEdelete /Users /ID에 해당하는 지정된 ID의 사용자 정보를 삭제합니다.
반점
SQL 명령의 UpdatePatch /Users /ID에 해당하는 서버에서 리소스의 일부 속성을 업데이트하여 지정된 ID로 사용자의 특정 속성을 업데이트합니다.
URL의 규칙
URL의 명사는 복수형 형태를 사용합니다
URL의 이름이 단수 또는 복수형을 사용하는지 여부에 대한 문제는 논란의 여지가 있습니다. URL의 명사는 일반적으로 데이터베이스의 테이블에 해당하며 테이블은 유사한 데이터를 저장합니다. 실제로, 나는 복수형 형태의 사용을 강요하는데, 이는 더 편안해 보입니다.
/사용자/사용자/1/역할/역할/역할/1
불규칙하고 셀 수없는 명사에 관해서는, 그것은 당신의 의견에 달려 있습니다.
/heroes/heroes/1/people/people/1/foots/foots/feet/feet/feet/feet/feet/feet/1
버전
호환되지 않고 파괴적인 변경 사항을 처리하기 위해 URL에 추가 할 버전 번호를 말하십시오. 새 API를 출시 할 때 클라이언트는 새 API로 자유롭게 이동할 수 있으며 완전히 다른 새로운 API를 호출하여 문제가되지 않습니다. 직관적 인 "V"접두사를 사용하여 다음 번호가 버전 번호, 보조 버전 번호가 필요하지 않으며 API 버전을 자주 해제해서는 안된다는 것을 나타냅니다.
/edu/v1/users/edu/v1/역할
옵션의 복잡한 매개 변수에 쿼리 문자열을 사용하십시오
URL을 더 작고 간결하게 만들려면 리소스의 기본 URL을 설정하고 선택적 및 복잡한 매개 변수는 쿼리 문자열로 표시됩니다.
/edu/v1/users? enabled = 1 & roleiid = 1
페이징 정보를 제공하십시오
데이터베이스의 모든 리소스를 한 번에 반환하는 것이 좋지 않으므로 페이징 메커니즘이 필요합니다. 일반적으로 데이터베이스의 잘 알려진 매개 변수는 오프셋 및 제한에 사용됩니다.
/edu/v1/users? enabled = 1 & 오프셋 = 1 & 한계 = 15
클라이언트 가이 매개 변수를 전달하지 않으면 기본값을 사용해야합니다. 일반적으로 오프셋 = 0, 한계 = 10.
재료가 아닌 요청에 동사를 사용하십시오
때때로 API 호출에는 리소스가 포함되지 않으며,이 경우 서버는 작업을 수행하고 결과를 클라이언트에 반환합니다.
/edu/v1/calc? p = 100
특정 리소스 및 크로스 자원 검색을 고려하십시오
특정 종료 끝에 대한 검색을 쉽게 제공 할 수 있습니다. 해당 리소스 수집을 사용하고 검색 문자열을 쿼리 매개 변수에 추가하면됩니다.
/edu/v1/users? username = li Qinghai
모든 리소스에 대한 글로벌 검색을 제공 해야하는 경우 다른 방법을 사용해야합니다.
/edu/v1/search? key = li Qinghai
응답 결과
작은 낙타 명명법을 속성 식별자로 사용하십시오
일반적으로 편안한 웹 서비스는 JavaScript로 작성된 고객이 사용합니다. 클라이언트는 JSON 응답을 JavaScript 객체로 변환 한 다음 해당 속성을 호출합니다. 따라서 JavaScript 코드 공통 사양을 따르는 것이 가장 좋습니다.
person.year_of_birth // 권장되지 않음, JavaScript 코드 일반 사양 인 Person.yearofbirth // 권장되지 않음, JavaScript 생성자 명명 된 person.yearofbirth // 권장됩니다.
페이징 정보를 제공하십시오
많은 결과가 반환되면 페이징 정보가 제공되어야합니다.
{ "page": 0, "size": 10, "Total": 3465, "obj": []}스프링 MVC 개발 REST 인터페이스
일반적인 주석
@RestController
@RestController는 @ResponseBody 및 @Controller의 조합 주석입니다.
@requestmapping
이 주석은 컨트롤러의 메소드 또는이 컨트롤러 클래스에 적용될 수 있습니다. 컨트롤러가 클래스 레벨에서 @requestmapping 주석을 추가하면이 주석이 컨트롤러의 모든 프로세서 메소드에 적용됩니다. 프로세서 메소드의 @requestmapping 주석은 클래스 수준에서 @requestmapping의 선언을 보완합니다.
@postmapping
조합 주석은 @requestmapping (method = requestmethod.post)의 약어입니다.
@putmapping
조합 주석은 @requestmapping (method = requestmethod.put)의 약어입니다.
@patchmapping
조합 주석은 @requestmapping (method = requestmethod.patch)의 약어입니다.
@deletemapping
조합 주석은 @requestmapping (method = requestmethod.delete)의 약어입니다.
@GetMapping
조합 주석은 @requestmapping (method = requestmethod.get)의 약어입니다.
@pathvariable
URL에서 데이터를 가져옵니다.
@requestparam
요청 된 매개 변수의 값을 가져옵니다.
REST 인터페이스 및 SWAGGER API 문서 예제
Swagger를 사용하려면 Spring Boot 프로젝트에서 Swagger2 사용을 참조하십시오. 메소드 본문의 코드는 중요하지 않으며, 중요한 것은 메소드의 서명과 HTTP 동사와의 매핑입니다.
import java.util.date; import javax.persistence.entityNotFoundException; import org.springframework.bean.bean.AntOn.AntOn.AUTOWERED; import org.spramframework.data.domain.page; import org.springframework.web.bind.annotation.getmapping; import; org.springframework.web.bind.annotation.patchmapping; import org.springframework.web.bind.annotation.pathvariable; import org.springframework.web.bind.annotation.postmapping; import org.springframework.web.bind.annotation.requestbody; org.springframework.web.bind.annotation.requestmapping; import org.springframework.web.bind.annotation.requestparam; import org.sprameframework.web.bind.annotation.restcontroller; import cn.com.infcn.jianshu.service.uservice.uservice.uservice.uservice cn.com.infcn.jianshu.exception.bizexception; import cn.com.infcn.jianshu.exception.loginnameorpasswordwordwordwordwordwordwordwordwordworderxception; import cn.com.infcn.jianshu.exception.resourceexistsexception; import cn.com.infcn.jianshu.user; cn.com.infcn.jianshu.util.jsonresult; import io.swagger.annotations.api; import io.swagger.annotations.apiparam;/** * 시스템 사용자 컨트롤러 * * @Author li Qinghai */ @api (value = "시스템 사용자 인터페이스", tags = "시스템 Management ")@restController@requestMapping ("/v3/edu/users ") 공개 클래스 usercontroller {@autowired private userervice userervice; /** * 사용자 추가 계정 ", 필수 = true) @requestparam (requestparam (requestparam) @Apiparam (name ="username ", value ="username ", residquestParam (requestParam (requestbody) @Apiparam (name ="password ", valueQuestiency" password, @apiparam (name = "rolid", value = "사용자 역할 번호", request = true) @requestparam (필수 = true) @requestbody string reaconId) rossecexistsexception {boolean ensists = thistists.userservice.exists (loginname); if (ensists) {새로운 ResourceExistSexception (loginname); } user user = userervice.create (loginName, password, username, reaconId); jsonresult.success (사용자)를 반환합니다. }/** * 로그인 계정 및 로그인 비밀번호가있는 사용자 로그인 * * @param loginname * 로그인 계정 * @param 비밀번호 * 로그인 비밀번호 * @throws entityNotFoundException */@apioperation */@apioperation */@apioperation ( "/login") @getMapping ( "/login") public jsonresult login (name = "", value " true) @requestparam (requestparam (requestparam) 문자열 loginname, @apiparam (name = "password", value = "login password", required = true) @requestparam (requestparam (request = true) 문자열 암호)로 loginnameorpassworderRorexception {user user = this.userService.login (loginname, password); if (null == user) {새 loginAmerPassWorderRorexception (); } return JSONRESULT.SUCCESS (사용자); }/** * 사용자 번호 * * @param id * 사용자 번호 * 사용자 번호 * @throws entityNotFoundException */@apioperation ( "Query 사용자 정보 쿼리 사용자 번호") @GetMapping ( "/{id}") public JSONRESULT Read (@Apiparam (@ApiParam (@ApipAram), value number, drimess " EntityNotFoundException {user user = this.userservice.getone (id); jsonresult.success (사용자)를 반환합니다. }/** * 계정이 취소되고 사용자의 데이터가 삭제되지 않습니다 * * @param userID * 사용자 번호 * @EpiOperation (value = "Carded on a @apioperation ("/{id} ") public jsonresult cance (@apiparam (@apiparam (@apiparam)" entityNotFoundException {this.userservice.cancel (id); return jsonresult.success (); }/** * 비밀번호 재설정 * * @param id * 사용자 번호 * @param password * 새 로그인 비밀번호 */@apioperation (value = "reset password") @patchmapping ( "/") public jsonresult updatepassword (@apiparam (name = "id", value = "사용자 번호, dru. requestparam (requiparam) @apiparam (true) "password", vale = "새 로그인 비밀번호", 필수 = true) @requestparam (requestparam (request = true) 문자열 비밀번호) {this.userService.upDatePassword (id, password); return jsonresult.success (); }/** * 멀티 컨디션 조합 쿼리 * * @param username * 사용자 이름 * @param roleceid * 사용자 역할 * @param 시작 * 시작 날짜 * @param 종료 * @param page * pagination, 0 * @param size * page per page aqueception * @apioperation (value quection) (value pholle) "). jsonresult query (@apiparam (name = "username", value = "사용자 이름, 쿼리 키워드", 필수 = false) @ApiParam (name = "rolId", value = "requestparam (requestparam (request = = false)) @apiparam (name = start =", start. @RequestParam (필수 = 거짓) 날짜 시작, @apiparam (name = "end", value = "사용자 역할 번호", 필수 = 거짓) @ApiParam (requestParam) 날짜 종료 (name = "page", vale = "pagination, 어느 페이지, 1", defaultValue = "1", required = int page (defaultValue = 1)). @apiparam (name = "size", value = "value ="페이지 당 행 수, positive 정수 ", defaultValue ="10 ", required = true) @requestparam (defaultValue ="10 ", requed = true) bizexception {page <user> datas = this.userservice.finddatas (username, ractid, page, size); if (null == datas || null == datas.getContent () || datas.getContent () isempty ()) {Throw New BizeXception ( "사용자가 존재하지 않는다"); } return JSONRESULT.SUCCESS (DATAS); }}Swagger2 인터페이스 문서 렌더링
위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.