一、http 请求 如何携带参数
在http请求中携带参数的方式取决于你使用的请求方法。常见的http方法有get和post,参数传递的方式也有所不同:
1. get 方法
get方法通常用于请求服务器发送资源,参数直接附加在url之后,通过?
分隔url和参数,多个参数之间用&
连接。例如:
get /search?query=网络安全&sort=latest http/1.1 host: www.example.com
这里,url是/search
,参数有两个:
query=网络安全
sort=latest
2. post 方法
post方法通常用于提交数据到服务器。与get方法不同,post方法通常将参数包含在请求体中,不显示在url中(但是普通的参数也可以出现在url中)。只有form 表单在post 请求中固定在 body、get 出现在url 中。这样可以发送更大的数据量,也更安全。参数可以以不同的格式发送,常见的有:
表单数据(application/x-www-form-urlencoded
)
数据以键值对形式发送,键值对之间用&
分隔,键和值之间用=
连接,类似于url查询字符串。例如:
post /submit http/1.1 host: www.example.com content-type: application/x-www-form-urlencoded content-length: 27 username=alice&password=1234
json数据(application/json
)
数据以json格式发送,适用于复杂结构的数据交换。例如:
post /api/data http/1.1 host: www.example.com content-type: application/json content-length: 47 {"username": "alice", "password": "1234"}
虽然get和post是最常见的,但http协议还支持其他方法,如put、delete等,这些方法也可以携带参数,通常是在请求体中,格式可以是表单数据、json或其他mime类型。
小技巧
- 使用get方法时,由于url长度存在限制,不适合传输大量信息。
- 使用post方法时,可通过适当的
content-type
头部来控制数据的编码方式。
二、spring mvc 接受参数
在 spring mvc 中,处理来自客户端的参数有几种常用的方式。spring mvc 提供了灵活的方式来接收来自 http 请求的参数,并将其绑定到控制器方法的参数中。这些方法包括使用注解如 @requestparam
, @pathvariable
, @requestbody
, 和 @modelattribute
等。下面是这些注解的基本使用方法:
1. 使用 @requestparam
这个注解用于处理来自查询字符串或表单数据的参数。例如,对于一个 get 请求,你可以这样使用:
@getmapping("/search") public string search(@requestparam("query") string query) { // 使用 query 参数 return "result for: " + query; }
如果你的参数名和方法的参数名相同,你还可以省略 @requestparam
中的值:
@getmapping("/search") public string search(@requestparam string query) { return "result for: " + query; }
如果参数⽐较多时, ⽅法声明就需要有很多形参. 并且后续每次新增⼀个参数, 也需要修改⽅法声明. 我们不妨把这些参数封装为⼀个对象.
@data public class person { private int id; private string name; private string password; } @requestmapping("/m3") public object method3(person p){ return p.tostring(); }
2. 使用 @pathvariable
用于处理 rest 风格的 url 中的参数,如:
@getmapping("/users/{userid}") public string getuser(@pathvariable("userid") long userid) { // 使用 userid 参数 return "user profile for id: " + userid; }
如果变量名和参数名相同,也可以省略:
@getmapping("/users/{userid}") public string getuser(@pathvariable long userid) { return "user profile for id: " + userid; }
3. 使用 @requestbody
这个注解用于处理 json 或 xml 等请求体数据。通常与 post 或 put 请求一起使用:
@postmapping("/users") public string adduser(@requestbody user user) { // 处理 user 对象 return "added user with id: " + user.getid(); }
4. 使用 @modelattribute
用于绑定请求参数到一个模型对象,通常用于处理表单提交:
@postmapping("/users/update") public string updateuser(@modelattribute user user) { // 更新 user 对象 return "updated user with id: " + user.getid(); }
5.传递数组和集合
spring mvc 可以⾃动绑定数组参数的赋值
@requestmapping("/m5") public string method5(string[] arrayparam) { return arrays.tostring(arrayparam); }
集合参数:和数组类似, 同⼀个请求参数名有为多个, 且需要使⽤ @requestparam 绑定参数关系 默认情况下,请求中参数名相同的多个值,是封装到数组. 如果要封装到集合,要使⽤ @requestparam 绑定参数关系
6.接受string 转成 json
jackson 是在 spring 框架中常用的 json 处理库。要使用 jackson 进行 json 与字符串的互转,首先需要在你的项目中添加 jackson 的依赖。如果你使用 maven,可以添加如下依赖到你的 pom.xml
文件:
<dependency> <groupid>com.fasterxml.jackson.core</groupid> <artifactid>jackson-databind</artifactid> <version>2.12.3</version> </dependency>
在 spring mvc 中,直接使用字符串来接收参数后再手动处理确实是一种可行的方法,尤其是在某些情况下,你可能想对接收到的数据进行特殊处理,或者原始数据格式与你的业务逻辑需求不完全匹配时。这种方式提供了更大的灵活性,允许你在将数据转换成 java 对象之前,先进行验证、清洗或者格式化。
import com.fasterxml.jackson.databind.objectmapper; public class jsonutil { public static string tojson(object obj) throws exception { objectmapper mapper = new objectmapper(); return mapper.writevalueasstring(obj); } } // 使用 person person = new person("alice", 30); string jsonstring = jsonutil.tojson(person); system.out.println(jsonstring);
例如,如果你希望接收一个 json 格式的请求体,但暂时不想将其自动绑定到一个 java 对象,你可以将请求体作为一个普通的字符串接收:
@postmapping("/api/data") public responseentity<string> processdata(@requestbody string rawdata) { try { // 手动解析 json 字符串 objectmapper mapper = new objectmapper(); jsonnode rootnode = mapper.readtree(rawdata); // 假设我们需要处理 name 字段 string name = rootnode.path("name").astext(); // 进行业务逻辑处理 return responseentity.ok("received name: " + name); } catch (jsonprocessingexception e) { return responseentity.badrequest().body("invalid json"); } }
三、常见问题
在 spring mvc 中,当你使用基本数据类型(如 int
, double
, boolean
等)作为方法参数时,确实可能遇到一些问题,尤其是涉及到参数可能不存在或可选的情况。这是因为基本数据类型不能接受 null
值,而包装类(如 integer
, double
, boolean
等)可以接受 null
值。
假设你有一个使用基本数据类型参数的方法:
@getmapping("/calculate") public string calculate(@requestparam("number") int number) { // 使用 number 参数 return "result: " + number * 2; }
如果 http 请求没有提供 number
参数,spring mvc 将尝试将 null
转换为基本类型 int
,这将失败并引发一个异常,因为基本类型不能接受 null
值。
解决方案
1.使用包装类
更改参数为相应的包装类可以解决这个问题,因为包装类可以接受 null
值:
@getmapping("/calculate") public string calculate(@requestparam("number") integer number) { if (number == null) { return "number parameter is missing"; } return "result: " + number * 2; }
2.设置默认值
另一个常用的解决方案是为 @requestparam
设置一个默认值,这样如果请求中没有提供该参数,将使用默认值:
@getmapping("/calculate") public string calculate(@requestparam(value = "number", defaultvalue = "0") int number) { // 无需检查 null,因为已经有默认值 return "result: " + number * 2; }
在这个例子中,如果没有提供 number
参数,number
将默认为 0
。
3.设置 required 为 false
你也可以将 @requestparam
的 required
属性设置为 false
,并使用包装类来明确表明这个参数是可选的:
@getmapping("/calculate") public string calculate(@requestparam(value = "number", required = false) integer number) { if (number == null) { return "number parameter is optional"; } return "result: " + number * 2; }
到此这篇关于spring mvc 接受请求参数的文章就介绍到这了,更多相关spring mvc 请求参数内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论