博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
@RequestBody和@RequestParam的请求方式get和post关系
阅读量:3646 次
发布时间:2019-05-21

本文共 3751 字,大约阅读时间需要 12 分钟。

get方法:

请求:例如

获取请求参数:

(1) 直接获取request    如: public String getHtml(HttpServletRequest request) {}

(2) 什么也不加,直接在方法中获取参数值   如: public String getHtml(String url, String token) {}

(3) 利用@RequestParam    如: public User getUserInfo(@RequestParam(value = "url",required = false) String url){}

post方法:

请求: 如: 

获取请求参数:

(1): 直接获取request    如: public String getHtml(HttpServletRequest request) {}

(2): 使用@RequestBody 可接受的参数 String, Map,JSONObject,或者对应的JavaBean,, 

post 请求的是json字符串,@RequestBody 将字符串转为Map<>类型@RequestMapping(value = "/search",method = RequestMethod.POST)public void search (@RequestBody Map
map){    System.out.println("传进来的参数:" + map);} post : {"key":"value"}@RequestMapping(value = "/test")public String getStart1(@RequestBody Map
map) { return map.toString();}

(3): 直接获取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拼接参数。如: 

1、默认方式

@RequestMapping(value = "/getUserInfo")public User getUserInfo(Integer id){}

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

2、使用@RequestParam

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

3、使用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才能解析出来。

@RequestBody是将post请求中内容转为一个整体对象。@RequestBody的解析有两个条件:

        1.POST请求中content的值必须为json格式(存储形式可以是字符串,也可以是byte数组);
        2.@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拼接的参数。

3、通用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;    }}

 

 

 

 

 

转载地址:http://rneyn.baihongyu.com/

你可能感兴趣的文章
吴恩达机器学习 8.12 神经网络:表述(Neural Networks: Representation)
查看>>
Java反射用途及实现
查看>>
说说&和&&的区别?
查看>>
ArrayList集合加入1万条数据,应该怎么提高效率
查看>>
tomcat服务器下springmvc获取ajax请求的中文参数乱码解决
查看>>
Windows10系统PHP安装及Apache配置支持PHP解析教程
查看>>
Ubuntu下使用docker配置nginx
查看>>
Ubuntu下Nginx+PHP7-fpm的配置
查看>>
小白学习JavaSE-day02
查看>>
小白学习JavaSE-day05-类与对象
查看>>
小白学习JavaSE-day06-类的继承
查看>>
小白学习JavaSE-day07之抽象类
查看>>
小白学习之JavaSE-day09-String与基本类型、包装类型的转换,StringBuffer的使用
查看>>
idea安装vue插件,新建文件没有Vue Component解决方法
查看>>
Linux之进程管理相关命令
查看>>
Linux虚拟机内如何安装Docker
查看>>
Docker容器内如何安装mysql
查看>>
SpringSecurity-模拟数据库认证
查看>>
vue整合ElementUI(适合新手快速入门)
查看>>
MySQL逻辑架构以及工作流程的简述
查看>>