这几天因为项目需要看了看关于restful的东西,这个确实很好用也很简洁,虽然不是特别懂,但是简单使用一下还是没问题的。

简单说下restful,这是一种软件架构风格,并不是什么技术,也不是标准。常用于客户端和服务器交互类的软件,比如前后端分离的项目、APP等。

第一篇文章是spring boot + jpa,现在如果要使用restful,直接在控制层(第一篇中提到的shopApi)设计这种风格的接口即可,不需要额外配置其他东西。

1.GET

首先我们先看看查询怎么用,需求是通过id查询用户信息

我用的是firefox的RESTClient,这个可以进行POST/GET/PUT/DELETE等多种请求。

这个请求查询的是id为1的用户信息,如果想查询其他用户信息,将1替换为其他用户id即可。

restfull传递多个参数 restful处理多参数查询_接口版本

后台查询如下(PathVariable这是一个注解,用来指明一个路径参数)


@ResponseBody
     @RequestMapping(value = "/user/{id}",method = RequestMethod.GET)
     public String selectUserById(@PathVariable("id") int id){
        //通过id查询user信息
        return id+"";
     }

当我们的查询中有多个参数时该怎么处理,大概想到这么几种方法

方法一:

将多个参数作为路径

restfull传递多个参数 restful处理多参数查询_json_02

后台使用多个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&param2=2),不过这样有点不伦不类,看个人喜好吧

方法四:

将所有的参数封装成json来传递,后台接收后在将参数解析出来。这样在高版本的tomcat可能有问题,就是参数中带有特殊字符,处理方式就是将特殊字符转义或者修改tomcat的配置,忽略特殊字符。

http://localhost:8012/shopApi/user/{"param1":1,"param2":2}

方法五:

使用form表单的形式提交。需要修改header参数(content-type: application/x-www-form-urlencoded),传入的参数需要使用@FormParam注解

restfull传递多个参数 restful处理多参数查询_接口版本_03

附:不同版本的接口处理

做过APP接口的朋友有没有遇到这样的问题,那就是如果APP部分功能更新了,就会需要新旧两个版本的接口。同一个业务逻辑写两个接口会不会很麻烦,如果版本更多了,那要写的接口会不会太多了......

restful的接口能很好的处理这个问题,因为实际上这就是一个接口,只不过有不同的版本。加入需要v1,v2,v3三个版本的接口,只需要修改路径中的v1就可以了。

restfull传递多个参数 restful处理多参数查询_restfull传递多个参数_04

后台代码如下(需要支持不同版本的接口,只需要加入对应的处理逻辑就行)

@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中。

restfull传递多个参数 restful处理多参数查询_接口版本_05

后台新增店铺代码如下(后台用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

restfull传递多个参数 restful处理多参数查询_json_06

后台代码如下

@ResponseBody
    @RequestMapping(value = "/shop",method = RequestMethod.PUT)
    public String updateShop(@RequestBody Shop shop){
        //修改店铺信息
        System.out.println(shop.getId()+"---"+shop.getShopName());
        return "success";
    }

4.DELETE

删除和查询比较类似,传入一个参数然后删除数据

restfull传递多个参数 restful处理多参数查询_restfull传递多个参数_07

后台代码如下

@ResponseBody
    @RequestMapping(value = "/shop/{id}",method = RequestMethod.DELETE)
    public String deleteShop(@PathVariable("id") int id){
        //通过id删除信息
        return id+"";
    }

以上就是基本的使用介绍了,如果有需要还会进行更新,有不合理的地方或者有好的建议欢迎指正