在深入细节之前,我知道Stackoverflow上已经有很多关于此类的讨论和相关问题。这些都以不同的方式帮助了我,所以我想把我的发现汇总成一个有组织的FAQ,以总结我的发现。
相关概念
当然,你肯定知道这些,但我只是简单地回顾一下。如果我漏掉了什么,请随意编辑。
HTTP POST请求:
当您想要向Web服务或服务器端应用程序发送对象时,使用POST请求。
序列化:
是将对象从Web浏览器传递到服务器端应用程序的过程。可以使用jQuery Ajax调用或Curl post请求。
序列化协议:
目前最流行的是JSON和XML。由于XML标记的特性,序列化的XML对象相对较大,因此XML正在变得越来越不受欢迎。在本FAQ中,主要关注JSON2序列化。
Spring:
Spring框架及其强大的注释使得以高效的方式暴露Web服务成为可能。Spring中有许多不同的库,我们关注的是Spring Web MVC。
Curl vs JQuery:
这些工具可以用于在客户端进行POST请求。即使您计划使用JQuery ajax调用,我建议您在调试时使用Curl,因为它可以在发出POST请求后提供详细的响应。
@RequestBody vs @RequestParam/@PathVariable vs @ModelAttribute:
在您有一个不依赖于Java EE模型的Web服务的情况下,必须使用@RequestBody。如果您正在使用模型并且您的JSON对象已添加到模型中,则可以通过@ModelAttribute访问该对象。仅在您的请求为GET请求或GET和POST请求组合的情况下,您才需要使用@RequestParam / @PathVariable。
@RequestBody vs @ResposeBody:
从名称中可以看出,只有在服务器端方法处理请求后向客户端发送响应时,才需要@ResponseBody。
RequestMappingHandlerAdapter与AnnotationMethodHandlerAdapter的区别:
RequestMappingHandlerAdapter是Spring框架中取代AnnotationMethodHandlerAdapter的新映射处理程序,自Spring 3.1以来如此。如果您现有的配置仍在使用AnnotationMethodHandlerAdapter,则可能会发现本文有用。我提供的配置将为您提供关于如何设置RequestMappingHandlerAdapter的想法。
设置
您需要设置消息转换器。这是将序列化的JSON消息体转换为服务器端的本地Java对象的方式。
基本配置请参考here。在basic configuration sample中,转换器为MarshallingHttpMessageConverter和CastorMarshaller,我已将它们替换为MappingJackson2HttpMessageConverter和MappingJacksonHttpMessageConverter。
配置放置位置
按照我的项目设置方式,我有两个配置文件:
- 应用程序上下文XML: 其中一个应用程序上下文XML文件,其中包含您的sessionFactory bean、dataSource bean等。
- MVC Dispatcher Servlet XML: 这是您拥有视图解析器bean并导入应用程序上下文XML的位置。
hadlerAdapter bean必须位于后面的MVC Dispatcher XML文件中。
<bean name="handlerAdapter"
class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
<property name="messageConverters">
<list>
<bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"/>
<ref bean="jsonConverter"/>
</list>
</property>
<property name="requireSession" value="false"/>
</bean>
<bean id="jsonConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="supportedMediaTypes" value="application/json"/>
</bean>
你可以拥有多个消息转换器。在这里,我创建了一个普通的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":"JohnBlog@user.com"}' http://localhost:8080/[YOURWEBAPP]/api/user/add
相关文章和问题
如果没有以下人员提供的文章和问题(如果我发现有用的相关文章/问题,此列表将扩展),则无法编写此常见问题解答:
- 什么是正确的JSON内容类型?
- 使用jackson消息转换器在Spring 3.0中生成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类型是什么?