Toggle navigation
VA伐木累
社区
VA伐木累
Proxy
JSON
BASE64
MyGit
登录
注册
×
登录
邮箱
密码
忘记密码?
SpringMVC的Controller接受参数适配
•发布于
•作者
liuzy
•1012 次浏览
•最后一次编辑是
•来自
技术
**在使用Controller直接接受Bean作为传入参数时,经常遇到服务器415错误。** **为总结经验,我使用HttpURLConnection向SpringMVC项目接口发起请求,测试Controller接受参数的情况** **测试过程如下,你也可以直接跳到最后总结。** **SpringMvc的部分配置,我给Spring配置的是FastJson转换器。因为它可以配置一些参数,例如把Null转为""。** ```
WriteMapNullValue
WriteNullNumberAsZero
WriteNullBooleanAsFalse
WriteNullStringAsEmpty
``` **接受请求的Controller代码如下** ``` @Controller @RequestMapping("/test") public class Test { @RequestMapping("/one") @ResponseBody public Object one(String u, String p) { Vo vo = new Vo(u, p); System.out.println("one: " + vo); return vo; } @RequestMapping("/two") @ResponseBody public Object two(@RequestParam(required = false) String u, @RequestParam(required = false) String p) { Vo vo = new Vo(u, p); System.out.println("two: " + vo); return vo; } @RequestMapping("/three") @ResponseBody public Object three(@RequestBody(required = false) String u, @RequestBody(required = false) String p) { Vo vo = new Vo(u, p); System.out.println("three: " + vo); return vo; } @RequestMapping("/four") @ResponseBody public Object four(@RequestBody(required = false) Vo vo) { System.out.println("four: " + vo); return vo; } } ``` **发起请求的类HttpClient代码如下** ``` public class HttpClient { public static void main(String[] args) { HttpClient client = new HttpClient(); String one = "http://127.0.0.1/test/one"; String two = "http://127.0.0.1/test/two"; String three = "http://127.0.0.1/test/three"; String four = "http://127.0.0.1/test/four"; // client.put2url("u", "liuzy").put("p", "111111"); // client.put2body("u", "liuzy").put("p", "111111"); // client.setBodyType("json"); // client.put2header("Content-Type", "application/json"); client.doGET(one); client.doGET(two); client.doGET(three); client.doGET(four); client.doPOST(one); client.doPOST(two); client.doPOST(three); client.doPOST(four); } private static void log(String msg) { System.out.println(msg); } private String bodyType = "kvStr"; private Map
urlParams = new HashMap<>(); private Map
bodyParams = new HashMap<>(); private Map
headerParams = new HashMap<>(); public Map
put2url(String key, String value) { urlParams.put(key, value); return urlParams; } public Map
put2body(String key, String value) { bodyParams.put(key, value); return bodyParams; } public Map
put2header(String key, String value) { headerParams.put(key, value); return headerParams; } public void setBodyType(String bodyType) { this.bodyType = bodyType; } public String doGET(String url) { return request(url, "GET"); } public String doPOST(String url) { return request(url, "POST"); } public String request(String url, String method) { log(url); String result = ""; try { url = addUrlParams(url); URL uri = new URL(url); HttpURLConnection conn = (HttpURLConnection) uri.openConnection(); conn.setRequestMethod(method); conn.setConnectTimeout(5000); conn.setReadTimeout(5000); addHeaderParams(conn); addBodyParams(conn); InputStream inputStream = conn.getInputStream(); result = readStream(inputStream); } catch (Exception e) { e.printStackTrace(); } log(result); return result; } private String addUrlParams(String url) { if (urlParams.isEmpty()) return url; StringBuilder sb = new StringBuilder(); if (!url.contains("?")) sb.append("?"); for (String key : urlParams.keySet()) { sb.append(key).append("=").append(urlParams.get(key)).append("&"); } return url + sb.substring(0, sb.length() - 1); } private void addBodyParams(HttpURLConnection conn) { try { conn.setDoOutput(true); OutputStream outputStream = conn.getOutputStream(); if ("json".equals(bodyType)) { String json = toJson(bodyParams); outputStream.write(json.getBytes()); } else { String kvStr = toKvStr(bodyParams); outputStream.write(kvStr.getBytes()); } } catch (Exception e) { e.printStackTrace(); } } private void addHeaderParams(HttpURLConnection conn) { for (String key : headerParams.keySet()) conn.addRequestProperty(key, headerParams.get(key)); } private String toJson(Map
params) { StringBuilder json = new StringBuilder("{"); for (String key : params.keySet()) { json.append("\"").append(key).append("\":\"").append(params.get(key)).append("\","); } return json.substring(0, json.length() - 1) + "}"; } private String toKvStr(Map
params) { StringBuilder sb = new StringBuilder(); for (String key : params.keySet()) { sb.append(key).append("=").append(params.get(key)).append("&"); } return sb.substring(0, sb.length() - 1); } private String readStream(InputStream inputStream) throws Exception { ByteArrayOutputStream outSteam = new ByteArrayOutputStream(); byte[] buffer = new byte[1024]; int len = -1; while ((len = inputStream.read(buffer)) != -1) { outSteam.write(buffer, 0, len); } outSteam.close(); inputStream.close(); return new String(outSteam.toByteArray(), "UTF-8"); } } ``` **测试开始** **测试1** `client.put2url("u", "liuzy").put("p", "111111");` doGET one 成功 doGET two 成功 doGET three 空 doGET four 报错 doPOST one 成功 doPOST two 成功 doPOST three 空 doPOST four 报错 **测试2** `client.put2body("u", "liuzy").put("p", "111111");` doGET one 成功 doGET two 成功 doGET three 错误的结果 doGET four 报错 doPOST one 成功 doPOST two 成功 doPOST three 错误的结果 doPOST four 报错 **测试3** `client.put2body("u", "liuzy").put("p", "111111");` `client.setBodyType("json");` doGET one 空 doGET two 空 doGET three 错误的结果 doGET four 报错 doPOST one 空 doPOST two 空 doPOST three 错误的结果 doPOST four 报错 **测试4** `client.put2body("u", "liuzy").put("p", "111111");` `client.setBodyType("json");` `client.put2header("Content-Type", "application/json");` doGET one 空 doGET two 空 doGET three 错误的结果 doGET four 成功 doPOST one 空 doPOST two 空 doPOST three 错误的结果 doPOST four 成功 **总结** 1、url参数是地址栏中,以&连接的kv字符串。 2、body参数是以流的方式写入以&连接的kv字符串(使用,连接转换器也能识别)。 3、在body中以流的方式写入json字符串时,如果没有header中设置类型为json,服务器拿到的是%7B%22u%22%3A%22liuzy%22%2C%22p%22%3A%22111111%22%7D=,他认为是kv,不能转为对象。 4、Controller的参数默认从url中的kv参数和body中的kv参数中取。 5、从Controller的日志可以看出,通常只需要一个@RequestBody就行了。 ** ^_^ ** [打赏](http://liuzhongyang.com/donate)
0 回复
作者
liuzy
积分: 841
“ 黑眼圈圈男 ”
无人回复话题
SonarQube 9.4 + PostgreSQL
shell倒计时
日常网络巧技
使用ssh创建socks5代理服务
NodeJS集群demo
作者其他话题
SonarQube 9.4 + PostgreSQL
shell倒计时
日常网络巧技
使用ssh创建socks5代理服务
NodeJS集群demo
回到顶部
友情链接:
JFinal
©2015 Powered by
jfinalbbs
沪ICP备15012258号