一、get方法

请求:例如http://127.0.01:1025/download?url=https://www.baidu.com&token=opera-dev

  • 获取请求参数:
  1. 直接获取request 如:
 public String getHtml(HttpServletRequest request) {}
  1. 什么也不加,直接在方法中获取参数值 如:
public String getHtml(String url, String token) {}
  1. 利用@RequestParam 如:
public User getUserInfo(@RequestParam(value = "url",required = false) String url){}

二、post方法

请求: 如:

  • 获取请求参数:
  1. 直接获取request 如:
 public String getHtml(HttpServletRequest request) {}
  1. 使用@RequestBody 可接受的参数 String, Map,JSONObject或者对应的JavaBean
// post 请求的是json字符串,@RequestBody 将字符串转为Map<>类型
@RequestMapping(value = "/search",method = RequestMethod.POST)
public void search (@RequestBody Map<String,String> map){System.out.println("传进来的参数:" + map);
} post : {"key":"value"}
@RequestMapping(value = "/test")
public String getStart1(@RequestBody Map<String,String> map) {return map.toString();
}
  1. 直接获取request,如:
 public String getHtml(HttpServletRequest request) {}
//这种方式只用在Content-Type=application/x-www-form-urlencoded这种情况下才能使用,sevlet将Body中的key-value转成Param。@RequestMapping(value = "/getUserInfo")
public User getUserInfo(@RequestParam(value = "id",required = false) Integer id){}

三、Get与Post区别

Get和Post都是Http协议的组件,所以底层都是使用tcp链接。Get的请求方式是将http的header和data一并发往服务端,也就是一条tcp数据包发送,这就会有两个问题:数据量有限,依赖于Tcp负载能力,所以携带的数据量很大的情况下,容易造成重发。有的携带的数据只能接受转化成ASCII字符。但是Post不一样,post使用两步走,先发送http的header,然后再传输data。数据类型也不受限制。而且数据隐秘性比较好。

四、Get方式参数获取

get请求方式参数是拼接在url后,所以限制了可以发送的长度。Get不支持使用http Body获取参数,他只支持params,也就是URL拼接参数。如:

http://127.0.01:1025/download?url=https://www.baidu.com&token=opera-dev
  1. 默认方式
@RequestMapping(value = "/getUserInfo")
public User getUserInfo(Integer id){}

默认情况下会从Param(就是URL后面的拼接参数)获取名字是id的项,自动转化成Integer类型,其他的类型也是类似。

  1. 使用@RequestParam
@RequestMapping(value = "/getUserInfo")
public User getUserInfo(@RequestParam(value = "id",required = false) Integer id){}
  1. 使用HttpServletRequest
@RequestMapping(value = "/getUserInfo")
public User getUserInfo(HttpServletRequest request){Integer id = Integer.parseInt(request.getParameter("id"));if (id.intValue() == 0) {return null;}
}

这个方法是获取整个URL的信息,然后手动获取和分离参数,和类型转化。这个里面带的内容很多,不仅Param还有Header,Cookies等

五、Post方式参数获取

post可以传递参数可以大致分成两种:

  • 一种是表单:在sevlet实现中mutipart/form-data和application/x-www-form-urlencoded会被特殊处理,请求参数将被放置于request.paramter,解析成map。
  • 第二种,已application/json,参数是存放在json中的,参数必须要用@RequestBody才能解析出来。
  • application/json和application/x-www-form-urlencoded区别

@RequestBody是将post请求中内容转为一个整体对象

  • @RequestBody的解析有两个条件:
  • POST请求中content的值必须为json格式(存储形式可以是字符串,也可以是byte数组)
  • @RequestBody注解的参数类型必须是完全可以接收参数值的类型,比如:Map,JSONObject,或者对应的JavaBean;所以Integer类型不能作为@RequestBody注解的参数类型,将上述代码修改如下(前端改成get请求)即可

1、使用@RequestBody 接收json字符串, Map,JSONObject,或者对应的JavaBean

@RequestMapping(value = "/download")public String getHtml(@RequestBody String json) {JSONObject jsonObject=JSON.parseObject(json);String url=jsonObject.getString("url");String token=jsonObject.getString("token");return " ";
}@RequestMapping(value = "/download")public String getHtml(@RequestBody User user) {return user.getName();
}//Integer类型不能作为@RequestBody注解的参数类型
@RequestMapping(value = "/getUserInfo")
public User getUserInfo(@RequestBody Integer id){}

2、使用@RequestParam

@RequestMapping(value = "/getUserInfo")
public User getUserInfo(@RequestParam(value = "id",required = false) Integer id){}

这种方式只用在Content-Type=application/x-www-form-urlencoded这种情况下才能使用,sevlet将Body中的key-value转成Param。

有一个有趣的现象:

  • 如果Content-Type=mutipart/form-data,Body中加入参数和URL后面拼接参数一起做Post请求,都可以被加载到Param中,如果是同名的,只取用form-data中的。
  • 如果Content-Type=application/x-www-form-urlencoded和URL拼接的一起,如果是String类型,则两个值会被拼接,其他类型取的是URL拼接的参数。
  1. 通用HttpServletRequest
      
    和Get方式一样,这是个通用的方式。这个也可以和URL拼接的一起搭,但是没有RequestParam的String类型值被拼接问题,优先级 form-data高于URL拼接高于x-www-form-urlencoded。
@RequestMapping(value = "/getUserInfo")
public User getUserInfo(HttpServletRequest request){Integer id = Integer.parseInt(request.getParameter("id"));if (id.intValue() == 0) {return null;}
}

六、@RequestParam注解

@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RequestParam {/*** 参数名称(和value同等意思)*/@AliasFor("name")String value() default "";/*** 参数名称 (和name同等意思)*/@AliasFor("value")String name() default "";/*** 是否必选(默认必选)*/boolean required() default true;/*** 参数默认值*/String defaultValue() default ValueConstants.DEFAULT_NONE;}
  • @RequestParam总体上来说,该注解类拥有三个参数:
  1. value、name 属性都标识请求参数名(必须配置);
  2. required:参数是否必传,默认为 true,可以设置为非必传false;(如果设置了必传或默认,请求未传递参数,将会抛出异常);
  3. defaultValue:参数默认值,如果设置了该值,required 将会自动设置为 false;
  • @RequestParam注解获取的参数放在请求哪?
  1. get请求的 requestHeaders 中 content-type 这个字段,使用 form-data 表单形式携带参数请求;
  2. Spring中的@RequestParam注解接收的参数大多数场景是来自requestHeaders中,即请求头,也就是url中,格式为:http://localhost:8080?name=yc&age=23,由于url 长度有限制,所以参数需要限制数量和值得长度;
  • 如何使用:
  1. 使用一:利用Postman工具,使用form-data提交Get请求  
    执行代码:
@RequestMapping(value = "/test", method = RequestMethod.GET)public void test(@RequestParam("id") Integer id,@RequestParam("name") String name,@RequestParam("age") Integer age) {log.info("id = {}, name = {}, age = {}", id, name, age);}

结果:

id = 1, name = yc, age = 23
  1. 使用二:不使用@RequestParam注解直接进行对象属性赋值(不推荐使用,容易和@ReuqestBody混淆)

代码执行:

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {private Integer id;private String name;private Integer age;
}@RequestMapping(value = "/test", method = RequestMethod.GET)public void test(User user) {log.info("id = {}, name = {}, age = {}", user.getId(), user.getName(), user.getAge());}

结果:

id = 1, name = yc, age = 23
  • 使用场景:
  1. 请求是为了查找资源,获取服务器数据
  2. 请求结果无持续性的副作用,例如:不会对数据库进行添加、修改、删除操作;
  3. 传入的参数不会太长,因为Get请求可能会产生很长的URL,或许会超过某些浏览器与服务器对URL的长度限制,导致请求失败

七、@RequestBody注解

@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RequestBody {/*** 默认参数必传*/boolean required() default true;}
  1. @RequestBody注解只拥有一个参数:

required 默认为 true,即对象中的属性必须有一个要传,否则会抛出异常:

org.springframework.http.converter.HttpMessageNotReadableException: Required request body is missing
  1. @RequestBody注解获取的参数在请求哪?
  • post请求的requestHeaders请求头中有content-type字段,一般用来处理:applicatin/json格式的参数;
  • Spring中的@RequestBody注解是用来接收请求体中的参数数据,即requestBody请求体中,故不受参数数据长度的限制;
  1. 如何使用?
    使用Postman工具发送json格式的数据:

执行代码:

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {private Integer id;private String name;private Integer age;}@RequestMapping(value = "/test", method = RequestMethod.POST)public void test(@RequestBody User user) {log.info("id = {}, name = {}, age = {}", user.getId(), user.getName(), user.getAge());}

结果:

id = 1, name = yc, age = 23
  1. 使用场景:
  1. 请求的结果有持续性作用,例如:对数据库添加、更新、删除操作

  2. 若使用Get请求,表单参数过长;

  3. 要传送的数据不是采用7位的ASCII编码;

  • 测试三:使用Post请求,@RequestParam也可以接收参数;

注意:也可以使用这种方式用,发送Post请求,参数拼接到url之后,这是因为协议之间没有做严格的区分,但这种方式不建议使用,这种方式就使用Get方式即可。例如:localhost:8888/optimus-prime/project/test?id=1&name=yc&age=23 使用浏览器请求数据,这种方式Get请求,但后端使用Post方式接收,访问不成功!

执行代码:

@PostMapping(value = "/test")
public void test(@RequestParam("id") Integer id,@RequestParam("name") String name,@RequestParam("age") Integer age) {log.info("id = {}, name = {}, age = {}", id, name, age);
}

结果:

id = 1, name = yc, age = 12

八、总结

  1. Http协议常用的四种请求方式:Post、Get、Put、Delete等;其中Put、Delete请求方式很少见,都可用Post方式代替!
  1. 对数据库而言: get 请求不修改数据库,只是查询。Post是增加记录,put是更新,Delete数据库删除;

  2. Put,Post,Delete 方式的请求参数会直接放在requestBody里

  3. 处理 request uri 部分的注解,路径参数变量:@PathVariable;

  4. 处理request header部分的注解:@RequestHeader, @CookieValue,@RequestParam

  5. 处理request body部分的注解:@RequestParam, @RequestBody;

综上所述:@RequestParam注解既可以接收Get方式的请求头中的参数,也可以接收Post方式的请求体中的参数

  1. get请求的 headers 中没有 content-type 这个字段,post 的 content-type 有 :
  1. application/x-www-form-urlencoded 这种就是一般的文本表单用 post 传地数据,只要将得到的data 用 @RequestParam 或request.getParamter() 获取即可;

  2. multipart/form-data ,用于文件上传,此时 form 的 enctype 属性必须指定为 multipart/form-data;

  3. application/json,将数据以json对象的格式传递

  4. text/xml;

  5. put 和 delete 请求的headers 是有 content-type 这个字段的,只不过这两个方法类型目前不常用;

参考文章
参考文章

@RequestParam和@RequestBody的区别 (结合 Get/Post )相关推荐

  1. postbody传参_post传参params与body的区别(@RequestParam和@RequestBody的区别)

    1.axios post请求  Content-Type默认为 application/x-www-form-urlencoded,我们传递参数的时,params里面的参数(简单的对象,通过 &quo ...

  2. @RequestParam和@RequestBody的使用

    0. 前言 发现一篇讲@RequestParam和@RequestBody的区别的文章,感觉写的挺好. 在编写项目的过程中,老出现前后端传递参数格式不一致.不统一的问题,@RequestParam和@ ...

  3. 获取后端接口请求中的参数(@PathVariable,@RequestParam,@RequestBody区别,使用postman请求

    获取参数 SpringBoot提供的获取参数注解包括:@PathVariable,@RequestParam,@RequestBody,三者的区别如下表: 一:后端接口什么都不加 postman请求后 ...

  4. HttpServletRequest和@Requestparam、@RequestBody、直接实体接收请求参数的区别与示例

    文章目录 概述 1.HttpServletRequest 2.@RequestParam 3.@RequestBody 4.直接实体接收 HttpServletRequest请求方法详解: 概述 客户 ...

  5. 重点:@RequestMapping(含参数详解)和@RequestParam、@RequestBody、@PathVariable、@RequestHeader

    @RequestMapping注解 @RequestMapping是一个用来处理请求地址到处理器controller功能方法映射规则的注解,这个注解会将 HTTP 请求映射到 MVC 和 REST 控 ...

  6. @RequestParam与@PathVariable的区别

    springMVC中的注解@RequestParam与@PathVariable的区别 1.@PathVariable @PathVariable是用来获得请求url中的动态参数的 @PathVari ...

  7. SpringMvc @RequestParam、 @RequestBody、@RequestPart 的区别

    注解@RequestParam接收的参数是来自requestHeader中,即请求头. RequestParam可以接受简单类型的属性,也可以接受对象类型. @RequestParam有三个配置参数: ...

  8. @requestparam @param @pathvariable @requestbody的区别

    @requestParam注解 用来获取前台传递过来的参数,例如获取以下链接的参数: http://api.nc.com/api/item/category/list?pid=0 public Str ...

  9. 浅谈@RequestParam与@RequestBody区别

    @RequestParam:与servlet的request.getParameter()用法一致,都是用来接收form表单的提交,默认是application/x-www-form-urlencod ...

最新文章

  1. oracle 跑旧的文件,移动datafile以后,旧的datafile是否还被Oracle使用
  2. oracle 数据文件recover,Oracle数据库意外删除数据文件的恢复(转载)
  3. HDU2068(错列排序)
  4. 崩坏3服务器故障 临时维护,崩坏3 11.5游戏故障处理及补偿说明
  5. 1011 牛牛学说话之-浮点数
  6. linux思科认证,思科CCIE认证知识点之IPv6地址
  7. 第5条:用枚举表示状态、选项、状态码
  8. 罗盘时钟制作代码_抖音八卦时钟手机屏保设置方法!
  9. 如何查看Android项目的gradle版本和路径
  10. 使用计算机创建表步骤,2012年计算机二级VFP表的创建和使用学习教程
  11. 深信服云桌面linux客户端,深信服桌面云
  12. 关系抽取之PCNN(Piece-Wise-CNN)
  13. 高等数学复习之空间解析几何
  14. 钱我所欲也,健康我所欲也,舍钱而取健康也
  15. android 模拟物品移动
  16. AtCoder Beginner Contest 224题解 A-G
  17. matlab 转换 地平赤道坐标系,赤道坐标系变为地平坐标系
  18. scratch 有趣的加减法
  19. NYOJ82-迷宫寻宝(一)
  20. 网络空间安全竞赛D模块解析

热门文章

  1. Vue的v-for中列表项拖拽排序详细方法
  2. 浅析软件工程中的UML建模技术
  3. 【Oracle】PL/SQL 显式游标、隐式游标、动态游标
  4. Nginx设置目录浏览并配置验证
  5. nginx源码分析之模块初始化
  6. 一步一步asp.net_三层构架的学习
  7. asp.net中上传文件实例
  8. Kaggle问题总结1
  9. 操作系统内存管理——分区、页式、段式管理
  10. 小结两种在Python中导入C语言扩展库的方法