在做开发时,有时可能因为某种原因,需要使目标系统对外暴露接口供第三方系统调用,这是为方便就可能暴露一个servlet,其接受参数只能从j2ee内置对象HttpServletRequest取参数,不同方式提交参数,取参数方式也不一样
方式一:
传json字符串
例如第三方ajax请求如下:
var str = {"title":"上线商品数","number":"45671","unit":"个"};
function getNum(){
$.ajax({
type : "POST",
url : "http://localhost:8080/updateBroadcastService",
data : JSON.stringify(str),
contentType : "application/json",
dataType : "json",
success: function (data){
console.log(data.message)
}
});
}
本系统接受参数:
//1.从http请求中获取json参数
InputStream is= null;
String contentStr="";
is = request.getInputStream();
contentStr= IOUtils.toString(is, "utf-8");
Map maps = (Map)JSON.parse(contentStr);
这样接受之后就会将传过来的json字符串转化成map,再从mao中获取参数处理业务,此为方式一
方式二:
传键值对参数
function getNum(){
$.ajax({
type : "POST",
url : "http://localhost:8080/updateBroadcastService",
data : {"title":"上线商品数","number":"45671","unit":"个"},
contentType : "application/x-www-form-urlencoded",
dataType : "json",
success: function (data){
console.log(data.message)
}
});
}
本系统接受参数:
Map maps = new HashMap();
Enumeration paramNames = request.getParameterNames();
while (paramNames.hasMoreElements()) {
String paramName = (String) paramNames.nextElement();
String[] paramValues = request.getParameterValues(paramName);
if (paramValues.length == 1) {
String paramValue = paramValues[0];
if (paramValue.length() != 0) {
maps.put(paramName, paramValue);
}
}
}
此种方式接受参数之后也会将ajax传递的键值对参数转化成map,再去map中参数处理业务,此为方法2
ajax提交post请求时注意事项:
1、ajax中,contentType: "application/json"是必须的。dataType: "json"是表示返回值是json格式,依据返回值类型而定。
2、data中,将json对象序列化。使用JSON.stringfy()函数或者双引号形式的字符串。
3、调试的一个技巧,有时候json变量和实体类相对复杂时提交老是报415或者400的错误又找不到原因,可以将Action中的实体类换成JSONObject 看看能不能接收到参数,@RequestBody JSONObject requestJso,接收后在JSON系列化到实体类。有次就是因为json变量向实体类转换时发生字符向数字转换的错误。