这几天因为项目需要看了看关于restful的东西,这个确实很好用也很简洁,虽然不是特别懂,但是简单使用一下还是没问题的。
简单说下restful,这是一种软件架构风格,并不是什么技术,也不是标准。常用于客户端和服务器交互类的软件,比如前后端分离的项目、APP等。
第一篇文章是spring boot + jpa,现在如果要使用restful,直接在控制层(第一篇中提到的shopApi)设计这种风格的接口即可,不需要额外配置其他东西。
1.GET
首先我们先看看查询怎么用,需求是通过id查询用户信息
我用的是firefox的RESTClient,这个可以进行POST/GET/PUT/DELETE等多种请求。
这个请求查询的是id为1的用户信息,如果想查询其他用户信息,将1替换为其他用户id即可。
后台查询如下(PathVariable这是一个注解,用来指明一个路径参数)
@ResponseBody
@RequestMapping(value = "/user/{id}",method = RequestMethod.GET)
public String selectUserById(@PathVariable("id") int id){
//通过id查询user信息
return id+"";
}
当我们的查询中有多个参数时该怎么处理,大概想到这么几种方法
方法一:
将多个参数作为路径
后台使用多个PathVariable接收
@ResponseBody
@RequestMapping(value = "/user/{param1}/{param2}/{param3}",method = RequestMethod.GET)
public String selectUsers(@PathVariable("param1") String param1,@PathVariable("param2") String param2,
@PathVariable("param3") String param3){
return "success";
}
方法二:
将多个参数封装成一个对象传入
方法三:
使用传统的方式,用&拼接参数(http://localhost:8012/shopApi/user?param1=1¶m2=2),不过这样有点不伦不类,看个人喜好吧
方法四:
将所有的参数封装成json来传递,后台接收后在将参数解析出来。这样在高版本的tomcat可能有问题,就是参数中带有特殊字符,处理方式就是将特殊字符转义或者修改tomcat的配置,忽略特殊字符。
http://localhost:8012/shopApi/user/{"param1":1,"param2":2}
方法五:
使用form表单的形式提交。需要修改header参数(content-type: application/x-www-form-urlencoded),传入的参数需要使用@FormParam注解
附:不同版本的接口处理
做过APP接口的朋友有没有遇到这样的问题,那就是如果APP部分功能更新了,就会需要新旧两个版本的接口。同一个业务逻辑写两个接口会不会很麻烦,如果版本更多了,那要写的接口会不会太多了......
restful的接口能很好的处理这个问题,因为实际上这就是一个接口,只不过有不同的版本。加入需要v1,v2,v3三个版本的接口,只需要修改路径中的v1就可以了。
后台代码如下(需要支持不同版本的接口,只需要加入对应的处理逻辑就行)
@ResponseBody
@RequestMapping(value = "/user/{version}/{id}",method = RequestMethod.GET)
public String selectUserByIdAndVersion(@PathVariable("version") String version,@PathVariable("id") int id){
if("v1".equals(version)){
System.out.println("这是第一版接口");
}else if("v2".equals(version)){
System.out.println("这是第二版接口");
}
return id+version;
}
2.POST
当我们需要新增时,往往都会把多个属性放到一个对象中请求,那也没问题,不过请求时需要设置http头字段(Content-Type:application/json),否则会报异常提示Content-Type不支持。
这里我想新增一个shop对象,对象中有id、shopName属性,可以将这两个属性放到json中,然后将json放入http请求的body中。
后台新增店铺代码如下(后台用Shop对象接收)
@ResponseBody
@RequestMapping(value = "/shop",method = RequestMethod.POST)
public String addShop(@RequestBody Shop shop){
//新增店铺信息
System.out.println(shop.getId()+"---"+shop.getShopName());
return "success";
}
3.PUT
更新方法跟新增比较类似,也可以传入一个对象,只不过请求换成了put
后台代码如下
@ResponseBody
@RequestMapping(value = "/shop",method = RequestMethod.PUT)
public String updateShop(@RequestBody Shop shop){
//修改店铺信息
System.out.println(shop.getId()+"---"+shop.getShopName());
return "success";
}
4.DELETE
删除和查询比较类似,传入一个参数然后删除数据
后台代码如下
@ResponseBody
@RequestMapping(value = "/shop/{id}",method = RequestMethod.DELETE)
public String deleteShop(@PathVariable("id") int id){
//通过id删除信息
return id+"";
}
以上就是基本的使用介绍了,如果有需要还会进行更新,有不合理的地方或者有好的建议欢迎指正