美文网首页Vue
天猫整站SSM (2)--GET、POST处理接口及返回json

天猫整站SSM (2)--GET、POST处理接口及返回json

作者: LeungJhowe | 来源:发表于2019-03-19 17:37 被阅读0次

一、简单的接口

(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)

相关文章

网友评论

    本文标题:天猫整站SSM (2)--GET、POST处理接口及返回json

    本文链接:https://www.haomeiwen.com/subject/fhlnmqtx.html