补习系列-springboot mime类型处理 (2)

通过观察请求响应,我们会得到以下的结果:

====> 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呢?
放心,框架会返回如下面的错误:

{ "timestamp": 1530626924715, "status": 415, "error": "Unsupported Media Type", "exception": "org.springframework.web.HttpMediaTypeNotSupportedException", "message": "Content type 'application/x-www-form-urlencoded' not supported", "path": "/content/json" } 三、springboot-xml处理

如上,通过springboot框架,我们快速实现了Json格式的输入输出。
那么,如何实现xml格式的处理呢?xml格式主要用于soap、rpc等领域,为了实现xml数据的序列化,我们需要添加jackson-xml依赖包

<!-- support for xml bean --> <dependency> <groupId>com.fasterxml.jackson.dataformat</groupId> <artifactId>jackson-dataformat-xml</artifactId> <version>2.8.6</version> </dependency>

接下来,声明一个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,
一个请求的样例如下:

====>Request: Content-Length →40 Content-Type →text/plain;charset=UTF-8 Date →Mon, 16 Jul 2018 13:50:14 GMT name=Lilei age=11 ====>Response: Content-Length →40 Content-Type →text/plain;charset=UTF-8 Date →Mon, 16 Jul 2018 13:50:14 GMT Welcome Lilei, you are 11 years old. Bye 五、文件上传下载

对于文件上传,我们需要将请求声明为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--

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zywxpf.html