前后端交互(SpringMVC)获取请求参数

一、前后端

前端:不仅仅是指客户端,app,小程序,还指两个后端服务之间的调用方

后端:被调用方

json:是前后端约定好的一种数据传输规范。

1,json的可视化。

2,json也是面向对象的,而且js天生就支持json

二、API篇

1、java接口:interface关键字。

2、http接口:和语言没有关系了,他是一种用http协议去通信。

5元组:源IP地址,源端口号,目的ip地址,目的端口号,通信协议(tcp协议)http协议

tcp协议:传输层协议就两个:一个tcp一个udp

http协议:三次握手,在用tcp去传输数据,然后4次挥手,http协议结束。

3、前后端交互无非就是,前端将数据告诉后端,后端执行一些操作,将数据返回给前端。

2.1、接口演示

1、创建springboot项目,使用postman来测试restful风格的接口

Restful 风格的请求是使用 “url+请求方式” 表示一次请求目的的,HTTP 协议里面四个表示操作方式的动词如下:

  • GET:用于获取资源
  • POST:用于新建资源
  • PUT:用于更新资源
  • DELETE:用于删除资源

例如:

  • /user/1 GET : 得到 id = 1 的 user
  • /user/1 DELETE: 删除 id = 1 的 user
  • /user/1 PUT: 更新 id = 1 的 user
  • /user POST: 新增 user

缺点:接口都是一个,统计的时候不好统计

import org.springframework.web.bind.annotation.*;

/**
 * 订单控制器
 *
 * @author yunyan
 * @date 2023/5/22
 */
@RestController
@RequestMapping("/order")
public class OrderController {

    @GetMapping
    public String get(){
        return "get";
    }

    @PostMapping
    public String post(){
        return "post";
    }

    @PutMapping
    public String put(){
        return "put";
    }

    @DeleteMapping
    public String delete(){
        return "delete";
    }
}

结果是如下所示,restful是通过请求方式区分接口

①get请求

 ②post请求

 ③put请求

 ④delete请求

 2.2、参数获取

2.2.1、java方法入参里没有注释

适用于:参数比较少的时候

缺点:请求参数比较多的时候,可能会丢参数,因为get请求有长度限制。

import org.springframework.web.bind.annotation.*;

/**
 * 订单控制器
 *
 * @author yunyan
 * @date 2023/5/22
 */
@RestController
@RequestMapping("/order")
public class OrderController {

    @GetMapping("/get-order")
    public String get(Order order){
        return order.toString();
    }

    @PostMapping
    public String post(){
        return "post";
    }
}

使用postman测试结果是:

 2.2.2、不使用?和&来拼接参数

@PathVariable注释作用是获取GetMapping中的参数

适用于:参数比较少,并且是单独的参数

还适用于动态接口,主要是为了统计不同的调用方式,看是哪一方调用的

@GetMapping("/{channel}get-order/{orderNo}/{orderName}")
    public String get1(@PathVariable("orderNo") String orderNo,@PathVariable("orderName")String orderName,@PathVariable("channel") String channel){
        System.out.println(channel);
return orderNo+orderName;
    }

结果是:

 动态接口:

 这是控制台打印出来的拿到的参数

 2.2.3、@RequestBody注解

这个注解会从http请求的body当中拿到json,并且反序列化成java对象

适用于请求参数非常多,body没有长度限制

 @PostMapping
    public String post(@RequestBody Order order){
        return order.toString();
    }

结果是:(属性要一一对应)

 2.2.4、获取数组类型的参数

Controller中的业务方法数组名称与请求参数的name一致,参数值会自动映射匹配

http://localhost:8080/order?strs=111&strs=222&strs=333

@RequestMapping("/order")
@ResponseBody
public void orderMethod(String[] strs) throws IOException {
    System.out.println(Arrays.asList(strs));
}

2.2.5、参数绑定注解 @requestParam

当请求的参数名称与Controller的业务方法参数名称不一致时,就需要通过@RequestParam注解显示的绑定

< form action= " ${ pageContext.request.contextPath } /order" method= "post" >
        < input type= "text" name= "name" ></br >
        < input type= "submit" value= " 提交 " ></br >
</ form >

@RequestMapping("/order")
@ResponseBody
public void orderMethod(@RequestParam("name") String username) throws 
IOException {
    System.out.println(username);
}

注解@RequestParam还有如下参数可以使用:

  • value:与请求参数名称
  • required:此在指定的请求参数是否必须包括,默认是true,提交时如果没有此参数则报错
  • defaultValue:当没有指定请求参数时,则使用指定的默认值赋值
@RequestMapping("/order")
@ResponseBody
public void orderMethod(@RequestParam(value="name",required = 
false,defaultValue = "hello") String username) throws IOException {
    System.out.println(username);
}

2.2.6、通过Servlet相关API

SpringMVC支持使用原始ServletAPI对象作为控制器方法的参数进行注入,常用的对象如下:

  • HttpServletRequest
  • HttpServletResponse
  • HttpSession
@RequestMapping("/order")
@ResponseBody
public void orderMethod(HttpServletRequest request,HttpServletResponse response,HttpSession session){
    System.out.println(request);
    System.out.println(response);
    System.out.println(session);
}

2.3、注意事项

在参数获取前三种常用方式中:

1,第一种方式中,如果参数重复了,取哪个?

答:如果是String类型的,会自动拼接,如果是整型,取第一个

2,第三种方式中,如果参数重复了,取哪个?

答:不管什么类型的,都取最后一个


3,第二种方式中,如何改成非必传

答:一个java方法,可以对应多个http接口

使用@Pathvariable(value = "name", required = false)来保证参数是否必填


4,第三种方式中,我想解析list怎么写,想解析嵌套对象怎么写

答:可以,只要json对象构造的正确,就能够解析。


5,encode和decode:

        当我使用第一种方式进行前后端交互的时候((url上面携带参数的这种),如果说参数中包含特殊字符,,比如说: ,; {} 我需要先对这个参数进行encode,后端接收到的参数是编码以后的,所以得decode才能使用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值