1.情景还原
使用struts2写的接口(服务端),要求对方(客户端)以json格式传输数据,但是使用request.getParameter()获取不到
2.问题剖析
application/x- www-form-urlencoded是Post请求默认的请求体内容类型,也是form表单默认的类型,可以使用request.getParameter()方法来获取请求参数值;
但是,当请求内容不是该类型时,就不能使用request.getParameter()方法来获取请求参数值了,具体如下:
当请求体内容为application/json类型时,需使用request.getReader()方法来获取请求内容值(字符流),经测试也可以使用字节流来获取;
当请求体内容为multipart/form-data类型时,需使用request.getInputStream()方法来获取请求内容值(字节流)。
3.解决方案
所需jar包
struts2-core-2.3.34.jar;
导入
import java.io.BufferedReader; import java.io.IOException; import javax.servlet.http.HttpServletRequest; import org.apache.struts2.ServletActionContext;
/** * 获取接口传递的JSON数据 * @explain * @param request HttpServletRequest对象 * @return JSON格式数据 */ public static JSONObject getJsonReqData () { // 获取Request对象 HttpServletRequest request = ServletActionContext.getRequest(); StringBuffer sb = new StringBuffer(); try { // json格式字符串 String jsonStr = ""; // 获取application/json格式数据,返回字符流 BufferedReader reader = request.getReader(); // 对字符流进行解析 while ((jsonStr = reader.readLine()) != null) { sb.append(jsonStr); } } catch (IOException e) { e.printStackTrace(); } // 将json字符串(jsonStr)-->json对象(JSONObject) JSONObject jo = JSONObject.fromObject(sb.toString()); return jo; }