通过观察请求响应,我们会得到以下的结果:
====> Request: Content-Type=application/json; { "key": "value" } ====> Response: Content-Type=application/json;charset=UTF-8 { "resultCode": "1ec407e1-d753-4439-b31c-bb7e888aa6a2", "key": "value" }使用Postman工具进行调试,可以非常直观的获得想要的信息,点击这里可以下载
异常情况
如果,请求的内容格式不是json,而是其他的如application/x-www-form-urlencoded呢?
放心,框架会返回如下面的错误:
如上,通过springboot框架,我们快速实现了Json格式的输入输出。
那么,如何实现xml格式的处理呢?xml格式主要用于soap、rpc等领域,为了实现xml数据的序列化,我们需要添加jackson-xml依赖包
接下来,声明一个Controller方法
@PostMapping(value = "/xml", consumes = { MediaType.APPLICATION_XML_VALUE }, produces = MediaType.APPLICATION_XML_VALUE) @ResponseBody public ParamData xmlIO(@RequestBody ParamData data) { data.setAge(data.getAge() + 1); return data; }这次,我们指定了consumes、produces都是application/xml,通过@RequestBody、@ResponseBody注解之后,
springboot框架会自动根据需求的内容格式进行转换。
这里的ParamData是一个简单的Pojo类:
public static class ParamData { private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }通过真实的请求-响应观测,我们得到如下的结果:
====> Request: Content-Type=application/xml; <ParamData> <name>Jim</name> <age>1</age> </ParamData> ====> Response: Content-Type=application/xml;charset=UTF-8 <ParamData> <name>Jim</name> <age>2</age> </ParamData>BTW,springboot 完成自动类型转换是通过内容协商实现的,相关的接口为ContentNegotiationManager。
默认情况下,对于声明了consumes及produce属性的方法,会按照声明的值进行处理,否则格式的转换会根据请求中的Content-Type、Accept头部来进行判断。
此外,实现请求/响应内容到DTO转换功能的是HttpMessageConverter接口。
准确说,内容转换是由springmvc框架提供,而springboot是一个整合模块的脚手架
四、http参数处理对于普通的表单请求参数处理,我们通常有两种方式:
通过方法参数映射
@PostMapping(value = "/form", consumes = { MediaType.APPLICATION_FORM_URLENCODED_VALUE }, produces = MediaType.TEXT_PLAIN_VALUE) @ResponseBody public String form(@RequestParam("name") String name, @RequestParam("age") int age) { return String.format("Welcome %s, you are %d years old", name, age); }通过参数绑定
@PostMapping(value = "/form1", consumes = { MediaType.APPLICATION_FORM_URLENCODED_VALUE }, produces = MediaType.TEXT_PLAIN_VALUE) @ResponseBody public String form1(ParamData data) { return String.format("Welcome %s, you are %d years old. Bye", data.getName(), data.getAge()); }form表单的请求内容格式为application/x-www-form-urlencoded,
一个请求的样例如下:
对于文件上传,我们需要将请求声明为multipart/form-data格式,一个文件上传的请求样例如下:
POST / HTTP/1.1 Host: localhost:8000 User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: en-US,en;q=0.5 Accept-Encoding: gzip, deflate Connection: keep-alive Upgrade-Insecure-Requests: 1 Content-Type: multipart/form-data; boundary=---------------------------8721656041911415653955004498 Content-Length: 465 -----------------------------8721656041911415653955004498 Content-Disposition: form-data; Test -----------------------------8721656041911415653955004498 Content-Disposition: form-data;; filename="flower.jpg" Content-Type: image/jpeg .... -----------------------------8721656041911415653955004498--