前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >javaWeb传收参数方式总结

javaWeb传收参数方式总结

作者头像
KEN DO EVERTHING
发布2019-01-17 16:18:51
2K0
发布2019-01-17 16:18:51
举报
文章被收录于专栏:KEN DO EVERTHINGKEN DO EVERTHING

有时候,我真会被传参搞得头晕,这样传要怎么接收,那样传又要怎么接收? get可以json吗?什么是json方式提交?等等问题,已困扰我许久 所以,在此想做个总结,整理一下思绪,不再为传收参烦恼!如有错误,望联系纠正,感谢!

首先梳理一下HTTP的一些知识

1.GET和POST请求,在传参方面有什么区别

GET传输的数据存储在URL上进行拼接 POST传输的数据存储在Requst Body(请求体)中

2.http请求的中Content-Type

http的请求头和响应头中都有Content-Type字段,这个字段向我们说明了请求和响应的HTTP body(请求体或响应体)存储了什么类型的数据,然后客户端和服务端就可以根据http头部得Content-Type正确解码HTTP body内容。

关联第1点:GET方式的请求和Content-Type是没有任何关系的,因为GET请求的数据在URL上。

好叻,进入正题。这里我们分为3种情况说明如何传参与接参,分别为 GET方式请求表单提交Json提交

1.GET方式请求

(1).普通URL get请求

代码语言:javascript
复制
http://localhost:8080/ajaxGet?id=1&username=用户名&userTrueName=真实姓名
代码语言:javascript
复制
//get也可以传json,通过参数传json字符串,然后后端进行解析(不过一般都不这么做)
http://localhost:8080/ajaxGet?user={"id":"1","username":"用户名","userTrueName":"真实姓名"}

(2).表单类GET请求

代码语言:javascript
复制
<form id="fromGet" action="fromGet" method="GET">
    <input type="text"name="id" value="1">
    <input type="text"name="username" value="用户名">
    <input type="text" name="userTrueName" value="真实名字">
</form>

(3).AJAX Get请求

(A)正确示例

代码语言:javascript
复制
$.ajax({
    type: "GET",
    url: "http://localhost:8080/ajaxGet",
    data:{"id":1,"username":"用户名","userTrueName":"真实名称"},
    //contentType:'application/x-www-form-urlencoded'
    contentType:'application/json'
});

注意:

1.data必须为json对象

2.实际上无需设置contentType

示例中我故意设置了contentType,但其实不管设置成什么都是无效的,因为传输的数据会在发送请求时,对Json对象进行编码解析,拼接到URL上,如下图

(B)错误示例(data为json字符串)

代码语言:javascript
复制
//data为json字符串
$.ajax({
    type: "GET",
    url: "http://localhost:8080/ajaxGet",
    data:JSON.stringify({"id":1,"username":"用户名","userTrueName":"真实名称"}),
    //contentType:'application/x-www-form-urlencoded'
    contentType:'application/json'
});

GET请求时,data不能使用json字符串,无法解析,如下图

SpringMvc接收参数方式

1.实体类接收 2.Map接收,必须使用@RequestParam注解 3.拆开单个参数接收(参数少的情况可使用)

2.Form表单提交

ps:针对POST,第一点包含了所有GET请求方式

form表单提交一般说的是content-type为x-www-form-unlencoded或multipart/form-data的请求

(1) 传统form表单提交,默认content-type为 x-www-form-unlencoded,如下

代码语言:javascript
复制
<form id="fromPost" action="fromPost" method="POST">
    <input type="text"name="id" value="1">
    <input type="text"name="username" value="用户名">
    <input type="text" name="userTrueName" value="真实名字">
</form>

(2) 含文件的form表单,需要指明enctype为 multipart/form-data(enctype相当于content-type)

代码语言:javascript
复制
<form id="fromPost" action="fromPost" method="POST">
    <input type="text"name="id" value="1">
    <input type="text"name="username" value="用户名">
    <input type="text" name="userTrueName" value="真实名字">
</form>

(3) Ajaxform表单提交

代码语言:javascript
复制
//data为json对象
$.ajax({
    type: "POST",
    url: "http://localhost:8080/ajaxPost",
    dataType: 'json',
    data:{"id":1,"username":"用户名","userTrueName":"真实名称"},
    contentType:'application/x-www-form-urlencoded'
});
SpringMvc接收参数方式

1.实体类接收 2.Map接收,必须使用@RequestParam注解 3.拆开单个参数接收(参数少的情况可使用) 4.后台的file文件需要使用MultipartFile类型接收

3.Json提交

ps:针对POST,第一点包含了所有GET请求方式

Json提交一般说的是content-type为application/json的请求,传输的Json是Json字符串

正确示例

代码语言:javascript
复制
//注意:data为json字符串 contentType为application/json
$.ajax({
    type: "POST",
    url: "http://localhost:8080/ajaxPost",
    dataType: 'json',
    data:JSON.stringify({"id":1,"username":"用户名","userTrueName":"真实名称"}),
    contentType:'application/json;charset=urf-8'
});

注意:data为Json字符串,这个很重要

SpringMvc接收参数方式

必须使用@RequestBody注解

1.字符串接收,然后对Json字符串解析转换

2.实体类接收

3.Map接收

如下:

代码语言:javascript
复制
//字符串接收
@PostMapping(value = "ajaxPost")
public void ajaxPost(@RequestBody String param){
    JSONObject json = JSON.parseObject(param);
}
代码语言:javascript
复制
//实体类接收
@PostMapping(value = "ajaxPost")
public void ajaxPost(@RequestBody User user){
}
代码语言:javascript
复制
//Map接收
@PostMapping(value = "ajaxPost")
public void ajaxPost(@RequestBody Map map){
}

总结:

1.GET请求方式与Form提交,后端spingMvc接收参数方式相同,如下

(1)实体类接收

(2)Map接收,必须使用@RequestParam注解

(3)拆开单个参数接收(参数少的情况使用)

(4)后台的file文件需要使用MultipartFil类型接收(form表单文件提交)

2.Json提交
必须使用@RequestBody注解

(1)字符串接收,然后对json字符串解析转换

(2)实体类接收

(3)Map接收

3.建议:

(1)参数少的查询使用Get请求,参数多可使用Post

(2)涉及到数据库的修改操作,使用Post请求

(3)Post请求统一使用Json提交(即content-type=application/json),统一方式方便前后端联调,json传参灵活

(4)参数多的,使用实体类接收,因为Map含有参数的不确定性,根本看不出你需要的啥参数,宁愿新建一个实体类接收参数,可增强代码的可读性

比如使用swagger api文档时,可使用注解标注的实体类对应参数,但用map的话,你要啥参数,鬼知道咯~

拓展知识:

@RequestParam注解

其实使用注解@RequestParam就等同于request.getParamter获取参数 但@RequestParam有更多的用处,它有以下几个重要属性

(1).value:前端传参的参数名称,这个属性可以使得前端参数名字与方法参数名不相同,使用这个参数进行数据绑定就ok了

代码语言:javascript
复制
//前端传参可以是"name" 方法参数中为"userName" 
//使用@RequestParam("name")可将name和userName进行绑定
//即可使用userName接收name的数据
@RequestMapping("/test")
public  void test(@RequestParam("name") String userName)){
}

(2)requried:表示是否是必须的参数,默认为true,所以加上@RequestParam,默认这个参数就是必须的,如果没有传对应参数会报错

(3)defaultValue:参数默认值。即设置默认值后,没有传参时,会赋予参数一个默认值。设置了默认值,就算必须参数不传也不会报错

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-01-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 java从心 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.GET和POST请求,在传参方面有什么区别
  • 2.http请求的中Content-Type
  • 1.GET方式请求
    • SpringMvc接收参数方式
    • 2.Form表单提交
      • SpringMvc接收参数方式
      • 3.Json提交
        • SpringMvc接收参数方式
        • 总结:
          • 1.GET请求方式与Form提交,后端spingMvc接收参数方式相同,如下
            • 2.Json提交
              • 必须使用@RequestBody注解
                • 3.建议:
                • 拓展知识:
                  • @RequestParam注解
                  相关产品与服务
                  数据保险箱
                  数据保险箱(Cloud Data Coffer Service,CDCS)为您提供更高安全系数的企业核心数据存储服务。您可以通过自定义过期天数的方法删除数据,避免误删带来的损害,还可以将数据跨地域存储,防止一些不可抗因素导致的数据丢失。数据保险箱支持通过控制台、API 等多样化方式快速简单接入,实现海量数据的存储管理。您可以使用数据保险箱对文件数据进行上传、下载,最终实现数据的安全存储和提取。
                  领券
                  问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档