您的位置:首页 > 编程语言 > Java开发

spring接收json格式参数的post请求

2017-05-05 00:00 381 查看
摘要: postman以post方式提交json格式参数的请求,在spring中如何接收到其中涉及到request相关的知识,HttpMessageConverter抽象过程。

最近的一个项目中开发一个接口,由于接口参数较多而且比较长,再加上其他原因。所以选择了以post的方式而且参数是json串的方式提交请求。遇到一些问题也很快解决了但是解决的过程中遇到一些有用的内容,现在记录下来。

1.postman提交json格式的请求如图,其中字段名编辑掉了:



2.最开始后台接收的代码如下:

@RequestMapping(value = "/cfak", method={RequestMethod.POST})
@ResponseBody
public String getCfaLabel(ServletRequest request) {   .....   }

想在request获取参数,结果都是空的,肯定是获取不了的,因为postman是把json串放在请求体里面。请求头里自然啥都没有了。

3.然后改成如下代码,用@RequestBody这个注解

@RequestMapping(value = "/cfak", method={RequestMethod.POST})
@ResponseBody
public String getCfaLabel(@RequestBody List<HashMap<String,Object>> params) {   ......    }

因为之前查过如果是一个简单的json串的话传Map,我想传的是一个比较简单的数组对象,所以也没多想就用这种试试。结果可想而知还是获取不到参数。然后网上查了一下数组的json串接收不推荐用List,直接把json数组中的属性映射成java对象然后用数组的方式接收。

4.再次修改成以下代码:

@RequestMapping(value = "/cfak", method={RequestMethod.POST})
@ResponseBody
public String getCfaLabel(@RequestBody CfakPo[] params) {  ......  }

其中CfakPo就是一个普通的POJO类:

public class CfakPo{
// 客户号
private String clientxxx;

// 手机号
private String phoneno;

// 身份证号
private String creditno;

// 所需要的列
private String column;

public CfakPo(String clientxxx, String column, String phoneno, String creditno){
this.clientxxx= clientxxx;
this.column = column;
this.phoneno = phoneno;
this.creditno = creditno;
}

public CfakPo(){}

这里还有个小坑就是POJO类一定要有自定义的无参构造函数。当时我没注意自定义了一个构造方法,导致默认无参构造方法没了就报错,然后补上才可以。

到这呢重要可以成功的获取到参数了,然而我并不想用这种方法,想来更简单的。于是尝试了这种似乎更简单。

5.从ResponseBody中直接获取json字符串然后自己用jackson再解析:

@RequestMapping(value = "/cfak", method={RequestMethod.POST})
@ResponseBody
public String getCfaLabel(@RequestBody String params) {

其中这种也是能够直接获取到一个postman中完整的json字符串的,然后可以自己再想办法解析。到这问题基本解决了,至于用哪一种方法可以根据项目的具体需要来选。

但是问题也来了:为什么凭借@requestBody这个注解就可以获取到json串呢,你定义String就给你返回一个String串,你定义一个Object数组就给你返回一个已经映射好的Object数组的java对象。这是怎么实现的??
在网上找到的一篇很好的博客的内容,完成的链接如下:[ SpringMVC使用消息转换器实现请求报文和对象、对象和响应报文之间的自动转换] (https://my.oschina.net/lichhao/blog/172562)
这张图也是从博客中拉下来的(请原谅盗个图= =!),这个图展示了Spring对请求及响应请求的过程抽象:



其中主要是这个HttpMessageConverter是一个接口,他有很多实现类:
比如:StringHttpMessageConverter这个其实就是把整个的json串当做一个字符串来处理了。
还有:MappingJackson2HttpMessageConverter 这个最终还是需要我们添加jackson或者其他处理json的jar包
还有:XmlAwareFormHttpMessageConverter 这个是处理Xml的Converter在4.1.3中已经不推荐使用了。
至于Spring究竟在哪个类的哪个方法中根据各种RequestBody的类型对应各种不同Converter暂时还没找到。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: