一.参数校验
1.需要参数校验的场景
(1)调用频次低的方法。
(2)执行时间开销很大的方法。
(3)需要提高稳定性和可用性的方法。
(4)对外提供的开放接口,api、rpc、http等。
(5)敏感权限的入口。
2.不需要校验参数的场景
(1)极有可能被循环调用的方法。
(2)底层调用频度比较高的方法,一般有错误提前就暴露了。
(3)被声明成私有方法。能够保证传入的参数提前做过检查。
二,参数的传入
http是个文本协议,所有上传的参数和接收的信息都是字符串。
1.parameters的方式,参数以一个个键值对传入
示例1:parameters的方式
function test_ajax(){
$.ajax({
type: "POST",
url: "tst",
data: {
openid: "testajax",
sign: "testsign"
},
success: function(data) {
console.log(data)
},
error: function() {
alert("fail!!!,请刷新再试!");
}
});
}
function test_post(){
$.post("tst", {"openid":"testOpenid2","sign":"testSign2"},function(data){
console.log("post "+data);
});
}
相当于访问http://localhost:8060/tst?openid=testajax&sign=testsign
注意参数都是有名字的。
后端接收HttpServletRequest:
@RequestMapping("/tst")
public Object get_value(HttpServletRequest req) {
Map<String, String> map = HttpHeadUtil.getParamsMapLimit(req);
return map;
}
jemeter请求数据:
POST http://localhost:8060/tst
POST data:
openid=testopneid&sign=testsign
[no cookies]
Request Headers:
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded
Content-Length: 31
Host: localhost:8060
User-Agent: Apache-HttpClient/4.5.3 (Java/1.8.0_131)
jmeter 响应数据
{"openid":"testopneid","sign":"testsign"}
还有其他的接收方式:
@RequestMapping("/del_goods")
void del_goods(HttpServletRequest req, HttpServletResponse resp, String sn, String shop_sn){}
void add_goods(@RequestParam String shop_sn,
@RequestParam String goods_desc,
@RequestParam Optional<Integer> point_need,){
2. requestBody的方式传入
消息参数没有name,传入的是个json字符串,也就是说消息体本身就是个唯一参数。
function testbody_ajax(){
$.ajax({
type: "POST",
dataType: 'json',
contentType:"application/json",
url: "tstbody",
data: '{ "openid": "testajax", "sign": "testsign" }',
success: function(data) {
console.log(data);
},
error: function() {
alert("fail!!!,请刷新再试!testbody_ajax");
}
});
}
后台接收
public static class LoginRequestVO implements Serializable{
private static final long serialVersionUID = 1L;
public String openid;
public String sign;
}
@RequestMapping("/tstbody")
public Object tstBody(@RequestBody LoginRequestVO test) {...}
需要注意的是 起作用的是消息头contentType:”application/json”, 这个消息头
代表上传的消息体是个json,没有参数名,而且消息体本身是个json。
这样spring在接收的时候会做处理,将json转为一个对象。这时候用request.getParameters是获取不到这个请求信息的。
从jemeter看请求和响应:
POST http://localhost:8060/tstbody
POST data:
{"openid":"jmeter","sign":"sign"}
[no cookies]
Request Headers:
Connection: keep-alive
content-type: application/json
:
Content-Length: 33
Host: localhost:8060
User-Agent: Apache-HttpClient/4.5.3 (Java/1.8.0_131)
{"result":1,"data":{"openid":"jmeter","sign":"sign"}}
其他
注意上一个例子ajax的这个 dataType: ‘json’, 代表接收到返回结果后会转化为一个json对象而不是一个json字符串不要跟spring mvc的参数和消息头弄混了。