一、简单的接口
(1)GET
@ResponseBody返回响应
value 接口,method方法,produces返回的相应头设置,
@RequestMapping默认是 get方法,
可简写get
@Request("/api")
JSON结构数据处理用的是fastjson.jar
@ResponseBody
@RequestMapping(value="/getRecommendSearch", method=RequestMethod.GET, produces={ "application/json;charset=UTF-8" })
public String home(Model model) {
JSONObject jo = new JSONObject();
List<Category> cs= categoryService.list();
jo.put("code", "000000");
jo.put("data", cs);
return JSONObject.toJSON(jo).toString();
}
(2)POST
@ResponseBody,@RequstMapping没有固定顺序
@RequestMapping(value="/loginByUser",method=RequestMethod.POST,produces = "application/x-www-form-urlencoded;charset=UTF-8")
@ResponseBody
public String loginByUser(@RequestBody String param) {
System.out.println("data:"+param);
JSONObject jo = new JSONObject();
Map<String, Object> m=(Map<String, Object> )jo.parse(param);
System.out.println(m);
JSONObject parseObject = jo.parseObject(param);
System.out.println(parseObject.get("username"));
JSONObject resultJo = new JSONObject();
resultJo.put("code", "000000");
resultJo.put("data", parseObject);
resultJo.put("data1", "cc");
return JSONObject.toJSONString(resultJo).toString();
}
二、如何获取前端传过来的参数(暂时先写出自己能够成功的)
(1)在路径中获取 (GET\POST都适用,不过一般post不建议在接口是写参数,尤其密码)
注意 ssm不能识别 /aa/bb?a=1&b=2 这种带?+参数的请求,
可以使y用 /aa/bb/a=1/b=2
@ResponseBody
@RequestMapping(value="/getCategorys/cid={cid}", method=RequestMethod.GET, produces= {"application/json;charset=UTF-8"})
public String getCategorys(@PathVariable("cid") Integer cid) throws Exception {
...
return JSONObject.toJSON(jo).toString();
}
(2)请求头content-type为application/json的post请求如果是(application/x-www-form-urlencoded,需要处理参数序列化参数)
@RequestMapping(value="/loginByUser",method=RequestMethod.POST)
@ResponseBody
public String loginByUser(@RequestBody String param) {
System.out.println("data:"+param);
JSONObject jo = new JSONObject();
JSONObject parseObject = jo.parseObject(param);
System.out.println(parseObject.get("username"));
JSONObject resultJo = new JSONObject();
resultJo.put("code", "000000");
resultJo.put("data", parseObject);
return JSONObject.toJSONString(resultJo).toString();
}
三、一些特别情况
(1)ssm + axios + post + 跨域 请求多发出个option个请求
一个是option方法访问是否有post,然后再post方法执行请求
如果不想要这个option访问 ,需要变为简单请求
什么是简单请求?什么事非简单请求?
满足以下两个条件
条件1 | 条件二 |
---|---|
方法为:GET、HEAD、POST | CONTENT-TYPE为 text/plain、 multipart/form-data、 application/x-www-form-urlencoded |
现在前端传的是application/x-www-form-urlencoded,的账号admin密码pwd参数,
但是因为是application/x-www-form-urlencoded,以在传之前就做了序列化,后台接收的字符串会是
%7B%22username%22%3A%22admin%22%2C%22password%22%3A%22pwd%22%7D=
符号中文字都会变
所以需要在前端对参数进行处理
需要qs插件 Npm install qs,或者直接找qs.min.js之类的,request配置
import request from '@/util/request'
Import Qs from 'qs'
export function loginByUser (form) {
// console.log()
return request({
url: `/loginByUser`,
method: 'post',
data: Qs.stringify(form)
})
}
处理后,后台接收的字符串就会变成看懂的data
username=admin&password=pwd
所以最好还需要后台对字符串进行操作转换成json操作
2019/3/20
补充:其实一开始有个想法java里面应该有方法进行转换,只是不知道叫什么?
后面发现其实java.net.URLDecoder可以做普通字符串和application/x-www-form-urlencoded MIME字符串的装换,那么可以在java后台进行转换了
URLDecoder类包含一个decode(String s,String enc)静态方法,它可以将application/x-www-form-urlencoded MIME字符串转成普通字符串;
URLEncoder类包含一个encode(String s,String enc)静态方法,它可以将普通字符串转换成application/x-www-form-urlencoded MIME字符串。
decode(String s,String enc)
encode(String s,String enc)
网友评论