常用的前端4种请求方式

一.GET请求:

第一种情形:

前端发送get请求,使用data方式传递参数。

export function empList(query){
  return request({
    url:'/emps/list',
    method:'get',
    data:query
  })
}

后端使用@GetMapping注解,不使用@RequestBody接收参数

@GetMapping("/list")
public Result listEmp(Emp emp){
       List<Emp> emps = empService.listEmp(emp);
       return Result.success(emps);
}
  • 这种方法实际接收不到前端传递来的参数,因为get请求参数传递不能是data,而应该是params。
  • 如果把后端接收参数方式改为@RequestBody,前端不作改动,则请求会报400错误(请求失败),后端报缺失需要的请求体,也就是需要Emp参数,但是前端并没有传送过来。
[org.springframework.http.converter.HttpMessageNotReadableException: Required request 
body is missing: public cn.cjc.pojo.Result
cn.cjc.controller.EmpController.list(cn.cjc.pojo.Emp)

结论:在获取数据,即查询数据库的时候,使用get请求方式,使用params的方式传递参数,或者使用url占位符的方式传递参数。不要在查询操作中使用post方法。

第二种情形:

前端发送get请求,不使用data方式传递参数。

export function selectById(id) {
  return request({
    url: '/emps/'+id,
    method: 'get',
  })
}

后端使用@GetMapping注解,使用@PathVariable接收参数

@GetMapping("/{id}")
public Result getById(@PathVariable Integer id){
       log.info("根据ID查询员工信息, id: {}",id);
       Emp emp = empService.getById(id);
       return Result.success(emp);
}

 结论:当前端发起GET请求时,若传递的是一个对象,则后端接收数据时,不需要用@RequestBody来转换JSON串,若传递的是一个具体的值或参数则后端必须用@PathVariable来接收。

二.POST请求

前端发送post请求,使用data方式传递参数

//POST请求,且传递的是一个对象
export function add(emp) {
  return request({
    url: '/emps',
    method: 'post',
    data: emp
  })
}

后端使用@PutMapping注解,使用@RequestBody接收参数

@PostMapping
public Result add(@RequestBody Emp emp){
       empService.add(emp);
       return Result.success();
}

结论: POST请求,一般用于新增或登录操作,通常传递为一个对象即一个JSON串,后端接收时必须使用@RequestBody注解来标识

三.PUT请求

前端发送put请求,使用data方式传递参数

export function update(emp) {
  return request({
    url: '/emps',
    method: 'put',
    data: emp
  })
}

后端使用@PutMapping注解,使用@RequestBody接收参数

@PutMapping
public Result update(@RequestBody Emp emp){
       empService.update(emp);
       return Result.success();
}
  • 如果前端使用data传递参数,后端不使用@RequestBody注解接收参数,则接收不到前端传递过来的参数(对象为null)。
  • 如果前端使用params传递参数,后端使用@RequestBody注解接收参数,则会报请求体缺失异常(请求体中需要Emp参数,但是没有)。
  • 如果前端使用params传递参数,后端不使用@RequestBody注解接收参数,是可以接收到前端传递过来的参数(对象为null)。
  • 虽然可以使用post代替put但是同样也不建议这样使用。

结论:当前端发起PUT请求时,若传递为一个对象即一个JSON串,则后端必须用@RequestBody注解进行标识;若传递参数为具体的值,后端接收时不需要任务注解进行标识。

四.DELETE请求

前端使用delete请求方式,URL中设置占位符参数

//传输单个参数
export function deleteById(id) {
  return request({
    url: '/depts/' + id,
    method: 'delete'
  })
}

后端使用@DeleteMapping注解,@PathVariable获取URL参数

  • 如果前端使用params传递参数,后端使用@RequestParam,则前端报400(请求失败),后端报缺少需要的参数错误;
  • 前端使用data传递参数,后端使用@RequestParam仍然不行,报相同的错误。
  • 使用post请求也可以完成delete的操作,但是不支持这样做。

结论:当前端发起DELETE请求时,传递的是一个具体的值或参数,后端接收参数必须用@PathVariable注解进行标识。

总结:主要针对于GET和POST请求:

1. GET拼接url,POST传递body,get限制字符串长度 
2. 请求缓存:GET 会被缓存,而post不会,原因是get是url的请求

3. 收藏书签:GET可以,而POST不能,原因是url可以收藏,

4. 保留浏览器历史记录:GET可以,而POST不能,原因是get的url请求
5. 用处:get常用于取回数据,post用于提交数据

6. 安全性:post比get安全,是因为post是请求体,不会在url上被劫持!

7. 请求参数:querystring是url的一部分get、post都可以带上。 
8. get的querystring仅支持urlencode编码,post的参数是放在body(支持多种编码) 
9. 请求参数长度限制:get请求限制字符串长度 ,post请求不限制字符串长度

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值