请求与响应,REST

169 阅读6分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第8天,点击查看活动详情

请求与响应

在这节中,将会学习请求映射路径,请求参数,日期类型参数传递,响应json数据。主要目标:学会如何通过输入json数据并如何呈现到不同页面上,且由不同页面如何转化为json数据。并学习一些注解的使用。请求和响应对json的处理依赖于HttpMessageConverter接口

1.请求映射路径

image.png

请求方式

Get请求

bug:有时会报服务器被占用的异常,这是由于另一控制台没有关闭

image.png

Post请求

image.png 但是,在上述操作加入中文会产生乱码现象。因此在配置类下做下述操作

//乱码处理
@Override
protected Filter[] getServletFilters() {
    CharacterEncodingFilter filter = new CharacterEncodingFilter();
    filter.setEncoding("UTF-8");
    return new Filter[]{filter};
}

请求参数

参数种类

  • 普通参数
  • POJO类型参数
  • 嵌套POJO类型参数
  • 数组类型参数
  • 集合类型参数

普通参数:请求参数与形参名称对应即可完成参数传递

@RequestMapping("/commonParam")
@ResponseBody
public String commonParam(String name,int age){
    System.out.println(name + "++++" + age);
    return "{'module':'common param'}";
}

普通参数:请求参数名与形参名不同时,使用@RequestParam注解关联请求参数名称与形参名称之间的关系

@RequestMapping("/commonParamDifferentName")
@ResponseBody
public String commonParamDifferentName( @RequestParam("name")String userName , int age){
    System.out.println("普通参数传递 userName ==> "+userName);
    System.out.println("普通参数传递 age ==> "+age);
    return "{'module':'common param different name'}";
}

POJO参数:请求参数与形参对象中的属性对应即可完成参数传递

@RequestMapping("/pojoParam")
@ResponseBody
public String pojoParam(User user){
    System.out.println("pojo参数传递 user ==> "+user);
    return "{'module':'pojo param'}";
}

嵌套POJO参数:嵌套属性按照层次结构设定名称即可完成参数传递

@RequestMapping("/pojoContainPojoParam")
@ResponseBody
public String pojoContainPojoParam(User user){
    System.out.println("pojo嵌套pojo参数传递 user ==> "+user);
    return "{'module':'pojo contain pojo param'}";
}

数组参数:同名请求参数可以直接映射到对应名称的形参数组对象中

@RequestMapping("/arrayParam")
@ResponseBody
public String arrayParam(String[] likes){
    System.out.println("数组参数传递 likes ==> "+ Arrays.toString(likes));
    return "{'module':'array param'}";
}

集合参数:同名请求参数可以使用@RequestParam注解映射到对应名称的集合对象中作为数据。相当于在数组的基础上加上@RequestParam注解

@RequestMapping("/listParam")
@ResponseBody
public String listParam(@RequestParam List<String> likes){
    System.out.println("集合参数传递 likes ==> "+ likes);
    return "{'module':'list param'}";
}

请求参数(传递json数据)

集合参数:json形式

1.在pom加入如下坐标

image.png 2.在spring配置类中加入如下注解

image.png 3.在postman中改为json数据输入

image.png 4.在参数前加入@RequestBody

//1.开启json数据格式的自动转换,在配置类中开启@EnableWebMvc
//2.使用@RequestBody注解将外部传递的json数组数据映射到形参的集合对象中作为数据
@RequestMapping("/listParamForJson")
@ResponseBody
public String listParamForJson(@RequestBody List<String> likes){
    System.out.println("list common(json)参数传递 list ==> "+likes);
    return "{'module':'list common for json param'}";
}
//集合参数:json格式
//1.开启json数据格式的自动转换,在配置类中开启@EnableWebMvc
//2.使用@RequestBody注解将外部传递的json数组数据映射到形参的保存实体类对象的集合对象中,要求属性名称一一对应
@RequestMapping("/listPojoParamForJson")
@ResponseBody
public String listPojoParamForJson(@RequestBody List<User> list){
    System.out.println("list pojo(json)参数传递 list ==> "+list);
    return "{'module':'list pojo for json param'}";
}

image.png

image.png

日期类型参数传递

//日期参数
    //使用@DateTimeFormat注解设置日期类型数据格式,默认格式yyyy/MM/dd
    @RequestMapping("/dataParam")
    @ResponseBody
    public String dataParam(Date date,
                            @DateTimeFormat(pattern="yyyy-MM-dd") Date date1,
                            @DateTimeFormat(pattern="yyyy/MM/dd HH:mm:ss") Date date2) {
        System.out.println("参数传递 date ==> " + date);
        System.out.println("参数传递 date1(yyyy-MM-dd) ==> " + date1);
        System.out.println("参数传递 date2(yyyy/MM/dd HH:mm:ss) ==> " + date2);
        return "{'module':'data param'}";
//    }

image.png

image.png 由convert接口完成

响应

响应页面

响应数据

  • 文本数据
  • json数据

返回一个页面可按下面的代码进行操作

//响应页面/跳转页面
//返回值为String类型,设置返回值为页面名称,即可实现页面跳转
@RequestMapping("/toJumpPage")
public String toJumpPage(){
    System.out.println("跳转页面");
    return "page.jsp";
}

要返回字符串即纯文本的话,得在方法上面加上@ResponseBody注解

//响应文本数据
//返回值为String类型,设置返回值为任意字符串信息,即可实现返回指定字符串信息,需要依赖@ResponseBody注解
@RequestMapping("/toText")
@ResponseBody
public String toText(){
    System.out.println("返回纯文本数据");
    return "response text";
}

通过实体类返回json数据

响应POJO对象 返回值为实体类对象,设置返回值为实体类类型,即可实现返回对应对象的json数据,需要依赖@ResponseBody注解和@EnableWebMvc注解

@RequestMapping("/toJsonPOJO")
@ResponseBody
public User toJsonPOJO(){
    System.out.println("返回json对象数据");
    User user = new User();
    user.setName("itcast");
    user.setAge(15);
    return user;
}

响应POJO集合对象

返回值为集合对象,设置返回值为集合类型,即可实现返回对应集合的json数组数据,需要依赖@ResponseBody注解和@EnableWebMvc注解

@RequestMapping("/toJsonList")
@ResponseBody
public List<User> toJsonList(){
    System.out.println("返回json集合数据");
    User user1 = new User();
    user1.setName("传智播客");
    user1.setAge(15);

    User user2 = new User();
    user2.setName("黑马程序员");
    user2.setAge(12);

    List<User> userList = new ArrayList<User>();
    userList.add(user1);
    userList.add(user2);

    return userList;
}

image.png 在这节里,@ResponseBody无处不在

该注解通过以下接口调用

image.png

REST简介

变现形式状态转换

优点:

1.隐藏资源的访问行为,无法通过地址得知对资源是何种操作

2.书写简化

image.png

入门案例

//设置当前请求方法为POST,表示REST风格中的添加操作
@RequestMapping(value = "/users",method = RequestMethod.POST)
@ResponseBody
public String save(){
    System.out.println("user save...");
    return "{'module':'user save'}";
}

//设置当前请求方法为DELETE,表示REST风格中的删除操作
//@PathVariable注解用于设置路径变量(路径参数),要求路径上设置对应的占位符,并且占位符名称与方法形参名称相同
@RequestMapping(value = "/users/{id}",method = RequestMethod.DELETE)
@ResponseBody
public String delete(@PathVariable Integer id){
    System.out.println("user delete..." + id);
    return "{'module':'user delete'}";
}

//设置当前请求方法为PUT,表示REST风格中的修改操作
@RequestMapping(value = "/users",method = RequestMethod.PUT)
@ResponseBody
public String update(@RequestBody User user){
    System.out.println("user update..."+user);
    return "{'module':'user update'}";
}

//设置当前请求方法为GET,表示REST风格中的查询操作
//@PathVariable注解用于设置路径变量(路径参数),要求路径上设置对应的占位符,并且占位符名称与方法形参名称相同
@RequestMapping(value = "/users/{id}" ,method = RequestMethod.GET)
@ResponseBody
public String getById(@PathVariable Integer id){
    System.out.println("user getById..."+id);
    return "{'module':'user getById'}";
}

//设置当前请求方法为GET,表示REST风格中的查询操作
@RequestMapping(value = "/users",method = RequestMethod.GET)
@ResponseBody
public String getAll(){
    System.out.println("user getAll...");
    return "{'module':'user getAll'}";
}

image.png

image.png @PathVariable用来获取路径上的参数并注入到相同名字的形参中

image.png

image.png 但其实,上述操作还是有一些不足之处,那就是有着太多冗余的代码了,因此,需要进行一些简化

1.将有value="/books"的公共项直接提取到类的上面通过@RequestMapping("/books")直接定义

PS:若该方法中有形参,则value="/{形参}"还需要保留

image.png 2.@RestController将@Controller和@ResponseBody进行整合,因此,直接在类上添加@RestController即可

3.@RequestMapping(method = RequestMethod.POST)可直接替换为@PostMapping

PS:若该方法中有形参,则value还需要保留,并且需要在相应的@xxxxMapping()括号中加入"/{形参}"

image.png

案例:基于RESTful页面数据交互

1.放行非springMVC的请求

遇到的第一个问题:

html页面会误被springmvc处理,导致输入对应网址会出现404

在config下新建一个类

image.png 在springMVC配置类中的注解中加入逗号后的内容

image.png 用图来表示步骤

image.png

image.png

image.png