本文介紹在使用springBoot如何進行Restful Api接口的開發及相關注解已經參數傳遞如何處理。
一、概念:
REST全稱是Representational State Transfer,中文意思是表述(編者注:通常譯為表征)性狀態轉移。 它首次出現在2000年Roy Fielding的博士論文中,Roy Fielding是HTTP規范的主要編寫者之一。 他在論文中提到:"我這篇文章的寫作目的,就是想在符合架構原理的前提下,理解和評估以網絡為基礎的應用軟件的架構設計,得到一個功能強、性能好、適宜通信的架構。REST指的是一組架構約束條件和原則。" 如果一個架構符合REST的約束條件和原則,我們就稱它為RESTful架構。
REST本身並沒有創造新的技術、組件或服務,而隱藏在RESTful背后的理念就是使用Web的現有特征和能力, 更好地使用現有Web標准中的一些准則和約束。雖然REST本身受Web技術的影響很深, 但是理論上REST架構風格並不是綁定在HTTP上,只不過目前HTTP是唯一與REST相關的實例。 所以我們這里描述的REST也是通過HTTP實現的REST。
二、注解說明:
1.Rest控制器
@RestController注釋用於定義RESTful Web服務。它提供JSON,XML和自定義響應。其語法如下所示
@RestController
public class UserRestController{
}
有了該注解,在響應返回的是json格式的數據,我們就不要寫@ResponseBody注解了
2.Java請求映射
@RequestMapping注釋用於定義訪問REST端點的Request URI。可以定義Request方法來使用和生成對象。默認請求方法是:GET。
@RequestMapping(value = "/user/userCode/{userCode}", method = RequestMethod.GET)
public ApiUser getUserByUserCode(@PathVariable("userCode") String userCode) {
AfaUser user = userService.getAfaUserByUserCode(userCode);
ApiUser apiUser=BeanUtils.copyBean(user,ApiUser.class);
if(user!=null){
List<OrgBean> orgs=this.getOrgParentListByOrgId(user.getMainOrgid());
apiUser.setOrgs(orgs);
}
return apiUser;
}
有人就問了,那要是我有多個參數,GET我怎么操作了:
方法一:換成POST請求,將所有參數封裝成一個類,然后使用 @RequestBody注解將參數自動解析成該類的一個實例
@ApiOperation(value = "根據用戶對象獲取用戶列表")
@RequestMapping(value = "/users", method = RequestMethod.POST)
public List<ApiUser> getUserListByApiUser(@RequestBody ApiUser apiUser) {
AfaUser afaUser = BeanUtils.copyBean(apiUser, AfaUser.class);
List<ApiUser> apiUserList=BeanUtils.copyList(userService.getAfaUserList(afaUser), ApiUser.class);
for(ApiUser _user:apiUserList){
if(StringUtils.isNotNullAndBlank(_user.getMainOrgid())){
List<OrgBean> orgs=this.getOrgParentListByOrgId(_user.getMainOrgid());
_user.setOrgs(orgs);
}
}
return apiUserList;
}
有人說那你這樣就不符合規范了,不過,這個“規范”只是建議大家這么來遵守,並不是強制要求
方法二:還是使用GET請求,但是將所有請求參數通過JSON格式來傳遞,controller拿到參數后,使用 JSON 相關的庫(如 gson),將該JSON轉化為相應的對象
public List<String> getName(@RequestParam String queryDtoStr) {
QueryDto queryDto = new Gson().fromJson(queryDtoStr, QueryDto .class);
// ....
return new ArrayList<>();
}
這樣請求的就要像這樣:
http://localhost:8080/app/names?queryDtoStr={"query1":12,"query2":2,"query3":2}
3.2 POST主要用於創建資源
HTTP POST請求用於創建資源。 此方法包含請求正文。可以發送請求參數和路徑變量來定義自定義或動態URL。例如:
@RequestMapping(value="/user", method = RequestMethod.POST)
public void doInsert(@RequestBody ApiUser apiUser) {
AfaUser user = BeanUtils.copyBean(apiUser, AfaUser.class);
userService.addAfaUser(user);
}
3.3 PUT主要用於更新資源
HTTP PUT請求用於更新現有資源,此方法包含請求正文。可以發送請求參數和路徑變量來自定義或動態URL。例如:
@RequestMapping(value = "/user", method = RequestMethod.PUT)
public void doUpdate(@RequestBody ApiUser apiUser) {
AfaUser user = BeanUtils.copyBean(apiUser, AfaUser.class);
userService.updateAfaUser(user);
}
3.4 DELETE主要用於刪除資源
HTTP DELETE請求用於刪除現有資源,此方法包含請求正文。可以發送請求參數和路徑變量來自定義或動態URL。例如:
@ApiOperation(value = "刪除用戶")
@RequestMapping(value = "/user", method = RequestMethod.DELETE)
public void doDelelte(@RequestBody ApiUser apiUser) {
AfaUser user = BeanUtils.copyBean(apiUser, AfaUser.class);
userService.delAfaUser(user);
}
以上方法參數是接收一個對象,如果是單個屬性,可以直接跟在url后面。
完整示例:
/**
*
* @author Shaw
*
*/
@RestController
@RequestMapping(value = "/rest", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
@Api(value = "/rest", tags = "UserRestController", description = "用戶管理接口")
public class UserRestController{
@Resource
private AfaUserService userService;
@Resource
private AfaRoleService afaRoleService;
@Resource
private AfaOrgService orgService;
@Resource
private MenuHelper menuHelper;
@Resource
private AfaOrgService afaOrgService;
@Resource
private AfaAuthPartyService afaAuthPartyService;
@ApiOperation(value = "新增用戶")
@RequestMapping(value="/user", method = RequestMethod.POST)
public void doInsert(@RequestBody ApiUser apiUser) {
AfaUser user = BeanUtils.copyBean(apiUser, AfaUser.class);
userService.addAfaUser(user);
}
@ApiOperation(value = "更新用戶")
@RequestMapping(value = "/user", method = RequestMethod.PUT)
public void doUpdate(@RequestBody ApiUser apiUser) {
AfaUser user = BeanUtils.copyBean(apiUser, AfaUser.class);
userService.updateAfaUser(user);
}
@ApiOperation(value = "刪除用戶")
@RequestMapping(value = "/user", method = RequestMethod.DELETE)
public void doDelelte(@RequestBody ApiUser apiUser) {
AfaUser user = BeanUtils.copyBean(apiUser, AfaUser.class);
userService.delAfaUser(user);
}
@ApiOperation(value = "修改密碼")
@RequestMapping(value = "/user/password", method = RequestMethod.PUT)
public void resetUserPassWord(@RequestBody ApiUser apiUser) {
AfaUser afaUser = BeanUtils.copyBean(apiUser, AfaUser.class);
userService.resetUserPassWord(afaUser);
}
@ApiOperation(value = "根據用戶編碼獲取用戶")
@RequestMapping(value = "/user/userCode/{userCode}", method = RequestMethod.GET)
public ApiUser getUserByUserCode(@PathVariable("userCode") String userCode) {
AfaUser user = userService.getAfaUserByUserCode(userCode);
ApiUser apiUser=BeanUtils.copyBean(user,ApiUser.class);
if(user!=null){
List<OrgBean> orgs=this.getOrgParentListByOrgId(user.getMainOrgid());
apiUser.setOrgs(orgs);
}
return apiUser;
}
@ApiOperation(value = "根據用戶id獲取用戶")
@RequestMapping(value = "/user/userId/{userId}", method = RequestMethod.GET)
public ApiUser getUserByUserId(@PathVariable("userId") String userId) {
if(StringUtils.isNotNullAndBlank(userId)){
AfaUser user = userService.getAfaUserByUserId(userId);
ApiUser apiUser=BeanUtils.copyBean(user,ApiUser.class);
if(user!=null){
List<OrgBean> orgs=this.getOrgParentListByOrgId(user.getMainOrgid());
apiUser.setOrgs(orgs);
}
return apiUser;
}
return null;
}
@ApiOperation(value = "根據角色編碼獲取用戶")
@RequestMapping(value = "/user/roleCode/{roleCode}", method = RequestMethod.GET)
public List<ApiUser> getUserByRoleCode(@PathVariable("roleCode") String roleCode) {
List<AfaUser> user = userService.getUserByRoleCode(roleCode);
return BeanUtils.copyList(user, ApiUser.class);
}
@ApiOperation(value = "獲取所有用戶")
@RequestMapping(value = "/users", method = RequestMethod.GET)
public List<ApiUser> getAllUserList() {
return BeanUtils.copyList(userService.getAfaUserList(),ApiUser.class);
}
@ApiOperation(value = "根據用戶對象獲取用戶列表")
@RequestMapping(value = "/users", method = RequestMethod.POST)
public List<ApiUser> getUserListByApiUser(@RequestBody ApiUser apiUser) {
AfaUser afaUser = BeanUtils.copyBean(apiUser, AfaUser.class);
List<ApiUser> apiUserList=BeanUtils.copyList(userService.getAfaUserList(afaUser), ApiUser.class);
for(ApiUser _user:apiUserList){
if(StringUtils.isNotNullAndBlank(_user.getMainOrgid())){
List<OrgBean> orgs=this.getOrgParentListByOrgId(_user.getMainOrgid());
_user.setOrgs(orgs);
}
}
return apiUserList;
}
@ApiOperation(value = "根據角色編碼獲取角色")
@RequestMapping(value = "/users/roleCodes", method = RequestMethod.POST)
public List<ApiUser> getUserByRoleCodes(@RequestBody List<String> roleList) {
return BeanUtils.copyList(userService.getUserByRoleCodes(roleList),ApiUser.class);
}
@ApiOperation(value = "根據角色編碼獲取角色")
@RequestMapping(value = "/users/page", method = RequestMethod.POST)
public Page<ApiUserOrgPos> queryAfaUserPage(@RequestBody Searcher searcher,Page<ApiUserOrgPos> page) {
Page<AfaUserOrgPos> apiUserOrgPos = BeanUtils.copyList(page, AfaUserOrgPos.class);
return BeanUtils.copyList(userService.queryAfaUserPage(searcher, apiUserOrgPos,null), ApiUserOrgPos.class);
}
@ApiOperation(value = "根據用戶對象獲取角色列表")
@RequestMapping(value = "/role/user/", method = RequestMethod.POST)
public List<ApiRole> getRolesByUser(@RequestBody ApiUser apiUser) {
AfaUser afaUser = BeanUtils.copyBean(apiUser, AfaUser.class);
String userCode=afaUser.getUserCode();
return BeanUtils.copyList(menuHelper.findRoleByUserCode(userCode, null), ApiRole.class);
}
@ApiOperation(value = "根據用戶Id對象獲取角色列表")
@RequestMapping(value = "/role/userId/{userId}", method = RequestMethod.GET)
public List<ApiRole> getRolesByUserId(@PathVariable("userId") String userId) {
AfaUser afaUser=userService.getAfaUserByUserId(userId);
String userCode=afaUser.getUserCode();
return BeanUtils.copyList(menuHelper.findRoleByUserCode(userCode, null), ApiRole.class);
}
@ApiOperation(value = "根據角色編碼、機構id獲取用戶列表")
@RequestMapping(value = "/users/{roleCode}/{orgId}", method = RequestMethod.GET)
public List<ApiUser> getUsersByRoleCodeAndOrgId(@PathVariable("roleCode") String roleCode, @PathVariable("orgId") String orgId) {
List<AfaUser> afaUserList=new ArrayList<AfaUser>();
//1、先獲取機構編碼
AfaOrg afaOrg=null;
if(StringUtils.isNotNullAndBlank(orgId)){
afaOrg=afaOrgService.getAfaOrgByOrgId(orgId);
}
String orgCode=null;
if(afaOrg!=null){
orgCode=afaOrg.getOrgCode();
}
//2、根據機構編碼和角色獲取角色授權表
List<AfaAuthParty> partyList=null;
if(StringUtils.isNullOrBlank(roleCode)&&StringUtils.isNullOrBlank(orgId)){
}else{
partyList=afaAuthPartyService.getAfaAuthPartyByRoleCodeAndOrgCode(orgCode,roleCode);
}
//3、根據party_type類型獲取用戶。
//當party_type為org的時候,獲取該org下的所有用戶
//當party_type為user的時候,判斷該用戶的主機構是不是orgId下的
if(partyList!=null&&partyList.size()!=0){
for(AfaAuthParty _party:partyList){
AfaUser afaUser=new AfaUser();
if(StringUtils.isNotNullAndBlank(orgId)){
afaUser.setMainOrgid(orgId);
}
if("org".equals(_party.getPartyType())){
afaUserList.addAll(userService.getAfaUserList(afaUser));
}
if("user".equals(_party.getPartyType())){
afaUser.setUserCode(_party.getPartyCode());
}
afaUserList.addAll(userService.getAfaUserList(afaUser));
}
}
if(afaUserList.size()!=0){
for (int i = 0; i < afaUserList.size()-1; i++) {
for (int j = afaUserList.size()-1; j > i; j--) {
if (afaUserList.get(j).getUserCode().equals(afaUserList.get(i).getUserCode())) {
afaUserList.remove(j);
}
}
}
}
return BeanUtils.copyList(afaUserList, ApiUser.class);
}
@ApiOperation(value = "更新某些機構下用戶的狀態")
@RequestMapping(value = "/users/status", method = RequestMethod.POST)
public void changeUserStatusByOrgIdList(@RequestBody UserRequestParam requestParamObject) {
if(CollectionUtils.isNotEmpty(requestParamObject.getOrgIdList())){
userService.changeUserStatusByOrgIdList(requestParamObject.getOrgIdList(),requestParamObject.getStatus());
}
}
@ApiOperation(value = "根據casn獲取用戶列表")
@RequestMapping(value = "/users/casn/{caSn}", method = RequestMethod.GET)
public List<ApiUser> getApiUserByCaSn(@PathVariable("caSn")String caSn) {
List<AfaUser> afaUser=userService.getApiUserByCaSn(caSn);
return BeanUtils.copyList(afaUser, ApiUser.class);
}
}
