javaweb应用开发,最常用到的就是应用之间的信息交互,调用别的应用模块得到自己想获取的数据信息,然后解析数据并进行处理返回到上一层。那controller层的方法如何获取http请求/webservice请求中的参数,或者说请求数据呢?
按照我个人的接触和理解,把请求可以分为两大类:
1.页面请求到后台controller层的请求。
2.别的应用http/webservice调用本应用中封装接口的请求。
无论哪种方式的请求,都是http请求(webservice底层也是http请求,待考证),controller层对请求数据的解析是按照json还是xml的依据就是请求头content-type,接下来我们就先来详细介绍一下。
content-type
content-type请求头是干吗的呢,http请求头有四种类型,分别是通用头部,请求头部,响应头部以及内容头部. 首先,我们要弄清楚,content-type是属于内容头部,既然是内容头部,那这个请求头是用来向接收端解释传递的该内容主体的,content-type的取值是告诉服务端,你传递过去的内容是啥,你应该准备好如何接收和解析。常用的content-type可以分为application/x-www-form-urlencoded , multipart/form-data ,application/json , text/xml四种。
下面一一介绍
1.application/x-www-form-urlencoded
application/x-www-form-urlencoded是常用的表单发包方式,普通的表单提交(即不带文件上传的提交),或者js (例如:post方式)发包,默认都是通过这种方式,提交代码demo如下:
function searchInfo() { $("#cxjg").datagrid({ url : basepath + 'jijin/getList', queryParams : getParam($("#query").serializeArray()), method : "post" }); function searchInfo(){ $("#cxjg").datagrid({ url:basepath+'jijin/getList', queryParams : {'age':23,'name':'zhangsan'}, method:"post" });
请求头信息如下所示,可以看到content-type和FormData(表单的数据格式)
如何获取这种数据结构的请求?有两种方式来解决
1.1 String 参数值=reqeust.getParameter(“参数名”);
(以springmvc 的controller层的方法为例)
@RequestMapping("/getParam") public String getParamFromRequest(HttpServletRequest request){ String jiJinCode=(String)request.getParameter("jinJinCode"); ... }
1.2 Map paramMap=request.getParameterMap();
@RequestMapping("/getParam") public String getParamFromRequest(HttpServletRequest request){ MapparamMap=request.getParameterMap(); StringBuffer inputDate=new StringBuffer(); inputDate.append(" "); for(Map.Entry entry :paramMap.entrySet()){ String key=entry.getKey(); String[] values=entry.getValue(); String value=null; if(values.length>0){ value=values[0]; } inputDate.append("<"+key+">"+value+""+key+">"); } return inputDate.toString(); }
两种方法比较来说,第一种适合当参数不多时,可以一个一个取。但第二种则是遍历出所有的请求参数,并生成标签格式,利于自动生成报文格式。
2.multipart/form-data
multipart/form-data用在页面(提交)发送文件的POST请求。之所以会和第一种content-type同是post提交,为啥在这里就变成multipart/form-data了呢?
当然程序不会自动识别是不是文件,而是我们在