Spring 4.x/3.x(Web MVC)REST API和JSON2的Post请求,如何一次搞定?
Spring 4.x/3.x(Web MVC)REST API和JSON2的Post请求,如何一次搞定?
在进入细节之前,我知道在Stackoverflow上已经有很多关于这个的问题和相关问题。它们都在不同的方面帮助了我,所以我决定将我的发现整理成一个有条理的常见问题解答,总结我的发现。
相关概念
当然你知道这些,但我只是简要回顾一下。如果我遗漏了什么,请随时编辑。
HTTP POST请求:
当你愿意向一个Web服务或你的服务器端应用程序发送一个对象时,可以使用POST请求。
序列化:
将对象从你的Web浏览器传递到服务器端应用程序的过程。可以使用jQuery Ajax调用或Curl POST请求。
序列化协议:
这些天最流行的是JSON和XML。由于XML标记的特性,序列化的XML对象相对较大,所以XML变得越来越不受欢迎。在这个常见问题解答中,主要关注的是JSON2序列化。
Spring:
Spring框架及其强大的注解使得以高效的方式暴露Web服务成为可能。Spring中有许多不同的库。我们在这里关注的是Spring Web MVC。
Curl vs JQuery:
这些是你在客户端使用的工具,用于进行POST请求。即使你计划使用JQuery的ajax调用,我建议你使用Curl进行调试,因为它可以在进行POST请求后给你提供详细的响应信息。
@RequestBody vs @RequestParam/@PathVariable vs @ModelAttribute:
在你的Java EE模型不依赖的情况下,必须使用@RequestBody。如果你正在使用模型,并且你的JSON对象已经添加到模型中,你可以通过@ModelAttribute访问该对象。只有在你的请求既是GET请求又是GET和POST请求的组合时,你才需要使用@RequestParam/@PathVariable。
@RequestBody vs @ResposeBody:
从名字可以看出,只有在服务器端方法处理请求后需要向客户端发送响应时,才需要使用@ResponseBody。
RequestMappingHandlerAdapter vs AnnotationMethodHandlerAdapter:
RequestMappingHandlerAdapter是Spring框架中取代了AnnotationMethodHandlerAdapter的新的映射处理器。如果你现有的配置仍然使用AnnotationMethodHandlerAdapter,你可能会发现这篇文章很有用。我在文章中提供的配置将让你了解如何设置RequestMappingHandlerAdapter。
设置
你需要设置一个消息转换器。这是将你序列化的JSON消息体转换为本地Java对象的方式。
从这里获取基本配置。在基本配置示例中,转换器是MarshallingHttpMessageConverter和CastorMarshaller,我用MappingJackson2HttpMessageConverter和MappingJacksonHttpMessageConverter替换了它们。
配置放在哪里
按照我的项目设置,我有两个配置文件:
- 应用程序上下文XML:
一个是应用程序上下文XML文件,其中包含了你的sessionFactory bean、dataSource bean等。
- MVC Dispatcher Servlet XML:
这是你的视图解析器bean所在的位置,也是导入应用程序上下文XML的地方。
handlerAdapter bean必须位于后者,即MVC Dispatcher XML文件中。
你可以有多个消息转换器。在这里,我创建了一个普通的JSON转换器和一个JSON 2转换器。XML文件中使用了ref和普通的bean格式(个人更喜欢ref标签,因为它更整洁)。
REST API
下面是一个暴露REST API的示例控制器。
控制器
这是你的HTTP POST请求的REST API的暴露位置。
@Component @Controller @RequestMapping("/api/user") public class UserController { @RequestMapping(value = "/add", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE) @ResponseBody public String insertUser(@RequestBody final User user) { System.out.println(user.toString()); userService.insertUser(user); String userAdded = "User-> {" + user.toString() + "} is added"; System.out.println(userAdded); return userAdded; } }
Java对象
@JsonAutoDetect public class User { private int id; private String username; private String name; private String lastName; private String email; public int getId() { return externalId; } public void setId(final int id) { this.id = id; } public String getName() { return name; } public void setName(final String name) { this.name = name; } public String getEmail() { return email; } public void setEmail(final String email) { this.email = email; } public String getUsername() { return username; } public void setUsername(final String username) { this.username = username; } public String getLastName() { return lastName; } public void setLastName(final String lastName) { this.lastName = lastName; } @Override public String toString() { return this.getName() + " | " + this.getLastName() + " | " + this.getEmail() + " | " + this.getUsername() + " | " + this.getId() + " | "; } }
CURL POST调用
curl -i -H "Content-Type: application/json" -X POST -d '{"id":100,"username":"JohnBlog","name":"John","lastName":"Blog","email":"JohnB[email protected]"}' http://localhost:8080/[YOURWEBAPP]/api/user/add
相关文章和问题
如果没有以下这些人提供的文章和问题,这个常见问题解答将不可能存在(如果我遇到有用的相关文章/问题,这个列表将会扩展):
- 正确的JSON内容类型是什么?
- Spring 3.0如何使用jackson消息转换器生成JSON响应
- 如何使用Curl从终端/命令行POST JSON数据来测试Spring REST?
- 将JSON发布到REST API
- https://github.com/geowarin/spring-mvc-examples
- 如何使用Curl将JSON发布到PHP
- Spring REST | MappingJacksonHttpMessageConverter生成无效的JSON
- https://github.com/eugenp/REST
- Spring Web MVC - 验证单个请求参数
- 如何使用Curl从终端/命令行POST JSON数据来测试Spring REST?
- 如何从Java Servlet返回JSON对象
- 如果REST API返回JSON,使用什么MIME类型?