SpringMVC系列之RESTful请求【RESTful详细介绍】

一、RESTful 是什么?

RESTFUL是一种网络应用程序的设计风格和开发方式,基于HTTP,可以使用XML格式定义或JSON格式定义。RESTFUL适用于移动互联网厂商作为业务使能接口的场景,实现第三方OTT调用移动网络资源的功能,动作类型为新增、变更、删除所调用资源。

二、RESTful的特点?

1、每一个URI代表1种资源;
2、客户端使用GET、POST、PUT、DELETE4个表示操作方式的动词对服务端资源进行操作:GET用来获取资源,POST用来新建资源(也可以用于更新资源),PUT用来更新资源,DELETE用来删除资源;
3、通过操作资源的表现形式来操作资源;
4、资源的表现形式是XML或者HTML;
5、客户端与服务端之间的交互在请求之间是无状态的,从客户端到服务端的每个请求都必须包含理解请求所必需的信息。

三、RESTful与HTTP的区别?

操作传递HTTP方式RESTful请求
查询GET [/user?id=1]GET [/user/1]
添加POST [/user/add(name=xx&age=21)]POST [/user json(k=v)]
更新POST [/user/update (name=xx&age=22)]PUT [/user json(k=v)]
删除POST [/user/del?id=1]DELETE [/user/1]

总结:

  1. 将网络上所有的内容描述成一种资源(图片、文件、用户数据…)
  2. 使用http请求方法描述动作 GET表示查询、post表示添加、put表示更新、delete表示删除
  3. 传参尽量使用json,但是并不是只能使用json

四、如何在spring mvc中使用RESTful请求?

spring mvc提供了 HiddenHttpMethodFilter 过滤器用于将POST请求转成PUT、 DELETE等请求。

具体操作步骤:

  1. 在配置文件web.xml中配置HiddenHttpMethodFilter
  2. 在form表单中写一个隐藏域,name属性值是_method,value就是请求方法(PUT、 DELETE)
  3. 在Controller中,需要使用注解来标识请求和方法。
    @RestController:由@Controller + @ResponseBody组成
    @PathVariable :映射 URL 绑定的占位符,举例:
//@PathVariable可以用来映射URL中的占位符到目标方法的参数中
	@RequestMapping("/user/{id}")
    public String testPathVariable(@PathVariable("id") Integer id)
    {
        System.out.println("user:"+id);
        return SUCCESS;
    }

这里在@RequestMapping()注解中,将路径中的一部分用{ }直接括了起来,括起来的部分,就是请求地址中的相同位置的那部分,例如:
http://loclhost:8080/user/1,此时这个地址会被@RequestMapping("/user/{id}") 注解抓取到,那么此时,根据相同位置,此时 {id} 的值就是 1。而我们又在下面的方法参数列表中使用了@PathVariable(“id”)注解,表示的意思就是上面@RequestMapping()注解中{}中的那么内容,直接映射到被@PathVariable注解修饰的变量中,那么此时@PathVariable()括号中指定的value是“id”,与上面@RequestMapping中 { } 括住的内容同名,都是id,那么上面的id的值就会映射到下面的这个@PathVariable(“id”)修饰的 Integer类型的 id变量中,所以Integer类型的id变量的值,就变成了@RequestMapping()中,被 { } 括住的那部分的值。

这里需要特别注意,{ } 括住的部分需要与 @PathVariable()括号中的部分 保持名称一致,而被@PathVariable修饰的变量原则上可以是任何的名字,不过我们在实际开发中,会将这三部分的值都统一成相同的值。

五、具体代码演示springmvc中RESTful请求

后端:

@RestController
public class TestRestController {

    @GetMapping("/user/{id}")
    //@PathVariable 的 参数名称需要跟上面{}中的参数名称完全一致
    public User queryById(@PathVariable("id") int id){
        System.out.println("id:"+id);
        User user =  new User();
        user.setId(id);
        user.setName("尼古拉");
        user.setAge(20);

        return user;
    }

    /**
     * 在被@RestController注释修饰后,如果要返回页面,只能使用ModelAndView作为返回值
     * @param user
     * @return
     */
    @PutMapping("/user")    //更新用户
    public ModelAndView updataUser(User user){
        System.out.println(user);
        /**
         * 此时的ModelAndView是请求转发进行页面跳转的,而此时Put请求没有办法使用请求转发到页面的。所以会报错。
         */
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.setViewName("hello");  //指定返回的页面名称
        modelAndView.addObject("result","测试REST请求");    //传参数

        return modelAndView;
    }
}

注意,上述代码中举例了GET请求和PUT请求,使用GET请求查询内容,使用PUT请求修改内容。通常,还有DELETE请求删除内容,POST请求增加内容。这些请求都有对应的拦截路径的注解,@PutMapping、@GetMapping、@PostMapping、@DeleteMapping。这四个注解其实就是@RequestMapping中又定义了method属性,只不过将它们单独分离了出来,更加方便使用。

前端:
由于前端页面form表单发送请求时,仅能为post或者get类型的请求。没有办法发送REST请求,此时,springmvc就会与开发者有一个约定,那就是它会根据一个信号来自动帮助我们进行请求方式的转化。这个信号标志就是:Form表单必须发送POST请求,并且,创建一个hidden隐藏域来存放一个name为_method,value为指定REST类型的请求名称即可。

代码举例:

 <form action="${pageContext.request.contextPath}/user" method="post">
    <%--value 大小写都可以--%>
     <input type="hidden" name="_method" value="put" />
     id: <input type="number" name="id" /> <br>
     name: <input type="text" name="name" /> <br>
     age: <input type="number" name="age" /> <br>
     <input type="submit" value="更新" />
 </form>

代码中,form的method请求必须写post,表单中添加了一行<input type="hidden" name="_method" value="put" />,这就是hidden隐藏域,name的值必须是“_method”,value是需要转成的REST类型请求。

那按照这样的写法,就是我们给spring mvc发送的信号标志,它在接收到以后,就会自动为我们进行请求类型的转化,而转化的过程,默认情况下,springmvc是做不到的,它需要我们在配置文件中做一下简单的配置,那就是配置一下HiddenHttpMethodFilter过滤器,用来转换REST请求。

配置:

需要在web.xml配置文件中添加如下代码:

 <filter>
    <filter-name>rest</filter-name>
    <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>rest</filter-name>
    <url-pattern>/* </url-pattern>
  </filter-mapping>

如此配置后,就可以过滤指定的请求了,由于我们<url-pattern>配置的是/*,所以就是所有的请求都会被过滤器拦截,用于查看是否存在我们的信号标志,如果有就为我们转化,如果没有就什么也不做。如此以来,前端就可以发送REST请求了,而后端在spring mvc的帮助下,也可以精准的拦截到指定的请求,用于处理。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值