[英]Spring Boot - How to get all request params in a map in Spring RestController?
[英]Spring MVC - How to get all request params in a map in Spring controller?
示例网址:
../search/?attr1=value1&attr2=value2&attr4=value4
我不知道 attr1、att2 和 attr4 的名称。
我希望能够做类似的事情(或类似的,不在乎,只要我可以访问请求参数名称的 Map -> value:
@RequestMapping(value = "/search/{parameters}", method = RequestMethod.GET)
public void search(HttpServletRequest request,
@PathVariable Map<String,String> allRequestParams, ModelMap model)
throws Exception {//TODO: implement}
如何使用 Spring MVC 实现这一点?
编辑
有人指出存在( 至少从 3.0 开始)一种纯 Spring MVC 机制,通过它可以获取这些数据。 这里就不详述了,因为是其他用户的回答。 有关详细信息,请参阅@AdamGent 的回答,不要忘记点赞。
在 Spring 3.2 文档中, RequestMapping
JavaDoc 页面和RequestParam
JavaDoc 页面都提到了这种机制,但之前,它只在RequestMapping
页面中提到。 在 2.5 文档中没有提到这种机制。
这可能是大多数开发人员的首选方法,因为它删除(至少是这个)与 servlet-api jar 定义的HttpServletRequest
对象的绑定。
/编辑
您应该可以通过request.getQueryString()
访问请求查询字符串。
除了 getQueryString 之外,查询参数也可以从request.getParameterMap()作为 Map 检索。
HttpServletRequest 对象已经提供了一个参数映射。 有关更多详细信息,请参阅request.getParameterMap() 。
这是在Map
中获取requestParams
的简单示例:
@RequestMapping(value="submitForm.html", method=RequestMethod.POST)
public ModelAndView submitForm(@RequestParam Map<String, String> reqParam) {
String name = reqParam.get("studentName");
String email = reqParam.get("studentEmail");
ModelAndView model = new ModelAndView("AdmissionSuccess");
model.addObject("msg", "Details submitted by you::Name: " + name
+ ", Email: " + email );
}
在这种情况下,它将绑定值:
studentName
name
与name
email
studentEmail
email
你可以简单地使用这个:
Map<String, String[]> parameters = request.getParameterMap();
那应该可以正常工作
有两个接口
org.springframework.web.context.request.WebRequest
org.springframework.web.context.request.NativeWebRequest
允许通用请求参数访问以及request/session
属性访问,与本机 Servlet/Portlet API 无关。
前任。:
@RequestMapping(value = "/", method = GET)
public List<T> getAll(WebRequest webRequest){
Map<String, String[]> params = webRequest.getParameterMap();
//...
}
PS 有关于可用作控制器参数的参数的文档。
在你的控制器方法中使用org.springframework.web.context.request.WebRequest
作为参数,它提供了getParameterMap()
方法,优点是你的应用程序不会被 Servlet API 束缚,WebRequest 是 JavaEE 的一个例子模式上下文对象。
我可能会迟到,但根据我的理解,您正在寻找这样的东西:
for(String params : Collections.list(httpServletRequest.getParameterNames())) {
// Whatever you want to do with your map
// Key : params
// Value : httpServletRequest.getParameter(params)
}
@SuppressWarnings("unchecked")
Map<String,String[]> requestMapper=request.getParameterMap();
JsonObject jsonObject=new JsonObject();
for(String key:requestMapper.keySet()){
jsonObject.addProperty(key, requestMapper.get(key)[0]);
}
所有参数都将存储在jsonObject
。
查询参数和路径参数之间存在根本区别。 它是这样的: www.your_domain?queryparam1=1&queryparam2=2
- 查询参数。 www.your_domain/path_param1/entity/path_param2
- 路径参数。
我发现令人惊讶的是,在 Spring MVC 世界中,很多人将两者混为一谈。 虽然查询参数更像是搜索条件,但路径参数很可能唯一标识资源。 话虽如此,这并不意味着您的 URI 中不能有多个路径参数,因为资源结构可以嵌套。 例如,假设您需要特定人员的特定汽车资源:
www.my_site/customer/15/car/2
- 寻找第 15 位客户的第二辆车。
将所有路径参数放入地图的用例是什么? 当您查看 URI 本身时,路径参数没有“键”,映射中的那些键将从您的 @Mapping 注释中获取,例如:
@GetMapping("/booking/{param1}/{param2}")
从 HTTP/REST 的角度来看,路径参数无法真正投影到地图上。 在我看来,这完全是关于 Spring 的灵活性和他们希望容纳任何开发人员的心血来潮。
我永远不会将映射用于路径参数,但它对于查询参数非常有用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.