SpringBootRestFul风格API接⼝开发
本⽂介绍在使⽤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 = "/products")
public List<ApiUser> getAllUsers(){
}
该注解还可以有⼏个属性:method制定请求允许的request⽅法,produces返回的数据类型,例如以下写法:
@RequestMapping(value = "/user/roleCode/{roleCode}", method = RequestMethod.GET,produces=MediaType.APPLICATION_JSON_UTF8_VALUE)
当然我们也可以在全局类前指定返回的数据类型。例如:
@RestController
@RequestMapping(value = "/rest", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
public class UserRestController{
....
}
3.Java请求主体
@RequestBody注释⽤于定义请求正⽂内容类型。
public List<ApiUser> getUserListByApiUser(@RequestBody ApiUser apiUser) {
}
4.Java路径变量
@PathVariable批注⽤于定义⾃定义或动态请求URI。请求URI中的Path变量定义为花括号{},如下所⽰
public List<ApiUser> getUserByRoleCode(@PathVariable("roleCode") String roleCode){
}
5.Java请求参数
@RequestParam注释⽤于从请求URL读取请求参数。默认情况下,它是必需参数。还可以为请求参数设置默认值,如下所⽰ -
public List<ApiUser> getUserByUserName(@RequestParam(value = "userName", required = false, defaultValue = "system") String userName) {
}
6.@RequestParam与@PathVariable的区别
在spring MVC中,两者的作⽤都是将request⾥的参数的值绑定到contorl⾥的⽅法参数⾥的,区别在于,URL写法不同。
例如
三、RestFul风格提交:
  RESTful架构应该遵循统⼀接⼝原则,统⼀接⼝包含了⼀组受限的预定义的操作,不论什么样的资源,都是通过使⽤相同的接⼝进⾏资源的访问。接⼝应该使⽤标准的HTTP⽅法如GET,PUT和POST,并遵循这些⽅法的语义。如果按照HTTP⽅法的语义来暴露资源,那么接⼝将会拥有安全性和幂等性的特性,例如GET和HEAD请求都是安全的,⽆论请求多少次,都不会改变服务器状态。⽽GET、HEAD、PUT 和DELETE请求都是幂等的,⽆论对资源操作多少次,结果总是⼀样的,后⾯的请求并不会产⽣⽐第⼀次更多的影响。
  本⽂主要介绍,POST、PUT、DELETE、GET四种风格的restful请求。@RequestMapping(value="/") method 不写的话,默认GET、POST都⽀持,根据前端⽅式⾃动适应。
3.1 GET主要⽤于资源的获取
例如:⽐如根据⽤户编码获取⽤户。我们就可以使⽤Get,传单个参数,根据参数去查询⽤户
@RequestMapping(value = "/user/userCode/{userCode}", method = RequestMethod.GET)
public ApiUser getUserByUserCode(@PathVariable("userCode") String userCode) {
AfaUser user = AfaUserByUserCode(userCode);
ApiUser pyBean(user,ApiUser.class);
if(user!=null){
List<OrgBean> MainOrgid());
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 = pyBean(apiUser, AfaUser.class);
List<ApiUser> AfaUserList(afaUser), ApiUser.class);
for(ApiUser _user:apiUserList){
if(StringUtils.isNotNullAndBlank(_MainOrgid())){
List<OrgBean> OrgParentListByOrgId(_MainOrgid());
_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<>();
springboot中文
}
这样请求的就要像这样:
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 = pyBean(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 = pyBean(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 = pyBean(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 = pyBean(apiUser, AfaUser.class);
userService.addAfaUser(user);
}
@ApiOperation(value = "更新⽤户")
@RequestMapping(value = "/user", method = RequestMethod.PUT)
public void doUpdate(@RequestBody ApiUser apiUser) {
AfaUser user = pyBean(apiUser, AfaUser.class);
userService.updateAfaUser(user);
}
@ApiOperation(value = "删除⽤户")
@RequestMapping(value = "/user", method = RequestMethod.DELETE)
public void doDelelte(@RequestBody ApiUser apiUser) {
AfaUser user = pyBean(apiUser, AfaUser.class);
userService.delAfaUser(user);
}
@ApiOperation(value = "修改密码")
@RequestMapping(value = "/user/password", method = RequestMethod.PUT)
public void resetUserPassWord(@RequestBody ApiUser apiUser) {
AfaUser afaUser = pyBean(apiUser, AfaUser.class);
}
@ApiOperation(value = "根据⽤户编码获取⽤户")
@RequestMapping(value = "/user/userCode/{userCode}", method = RequestMethod.GET)
public ApiUser getUserByUserCode(@PathVariable("userCode") String userCode) {
AfaUser user = AfaUserByUserCode(userCode);
ApiUser pyBean(user,ApiUser.class);
if(user!=null){
List<OrgBean> MainOrgid());
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 = AfaUserByUserId(userId);
ApiUser pyBean(user,ApiUser.class);
if(user!=null){
List<OrgBean> MainOrgid());
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 =  UserByRoleCode(roleCode);
pyList(user, ApiUser.class);
}
@ApiOperation(value = "获取所有⽤户")
@RequestMapping(value = "/users", method = RequestMethod.GET)
public List<ApiUser> getAllUserList() {
AfaUserList(),ApiUser.class);
}
@ApiOperation(value = "根据⽤户对象获取⽤户列表")
@RequestMapping(value = "/users", method = RequestMethod.POST)
public List<ApiUser> getUserListByApiUser(@RequestBody ApiUser apiUser) {
AfaUser afaUser = pyBean(apiUser, AfaUser.class);
List<ApiUser> AfaUserList(afaUser), ApiUser.class);
for(ApiUser _user:apiUserList){
if(StringUtils.isNotNullAndBlank(_MainOrgid())){
List<OrgBean> OrgParentListByOrgId(_MainOrgid());
_user.setOrgs(orgs);
}
}
return apiUserList;
}
@ApiOperation(value = "根据⾓⾊编码获取⾓⾊")
@RequestMapping(value = "/users/roleCodes", method = RequestMethod.POST)
public List<ApiUser> getUserByRoleCodes(@RequestBody List<String> roleList) {
UserByRoleCodes(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 = pyList(page, AfaUserOrgPos.class);
pyList(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 = pyBean(apiUser, AfaUser.class);
String UserCode();
pyList(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 AfaUserByUserId(userId);
String UserCode();
pyList(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)){
AfaOrgByOrgId(orgId);
}
String orgCode=null;
if(afaOrg!=null){
OrgCode();
}
//2、根据机构编码和⾓⾊获取⾓⾊授权表
List<AfaAuthParty> partyList=null;
if(StringUtils.isNullOrBlank(roleCode)&&StringUtils.isNullOrBlank(orgId)){
}else{
AfaAuthPartyByRoleCodeAndOrgCode(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(_PartyType())){
afaUserList.AfaUserList(afaUser));
}
if("user".equals(_PartyType())){
afaUser.setUserCode(_PartyCode());
}
afaUserList.AfaUserList(afaUser));
}
}
if(afaUserList.size()!=0){
for (int i = 0; i < afaUserList.size()-1; i++) {
for (int j = afaUserList.size()-1; j > i; j--) {
if ((j).getUserCode().(i).getUserCode())) {
}
}
}
}
pyList(afaUserList, ApiUser.class);
}
@ApiOperation(value = "更新某些机构下⽤户的状态")
@RequestMapping(value = "/users/status", method = RequestMethod.POST)
public void changeUserStatusByOrgIdList(@RequestBody UserRequestParam requestParamObject) {
if(CollectionUtils.OrgIdList())){
userService.OrgIdList(),Status());        }
}
@ApiOperation(value = "根据casn获取⽤户列表")
@RequestMapping(value = "/users/casn/{caSn}", method = RequestMethod.GET)
public List<ApiUser> getApiUserByCaSn(@PathVariable("caSn")String caSn) {
List<AfaUser> ApiUserByCaSn(caSn);
pyList(afaUser, ApiUser.class);
}
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。