Spring 4.x/3.x(Web MVC)REST API和JSON2的Post请求,如何一次搞定?

24 浏览
0 Comments

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

相关文章和问题

如果没有以下这些人提供的文章和问题,这个常见问题解答将不可能存在(如果我遇到有用的相关文章/问题,这个列表将会扩展):

  1. 正确的JSON内容类型是什么?
  2. Spring 3.0如何使用jackson消息转换器生成JSON响应
  3. 如何使用Curl从终端/命令行POST JSON数据来测试Spring REST?
  4. 将JSON发布到REST API
  5. https://github.com/geowarin/spring-mvc-examples
  6. 如何使用Curl将JSON发布到PHP
  7. Spring REST | MappingJacksonHttpMessageConverter生成无效的JSON
  8. https://github.com/eugenp/REST
  9. Spring Web MVC - 验证单个请求参数
  10. 如何使用Curl从终端/命令行POST JSON数据来测试Spring REST?
  11. 如何从Java Servlet返回JSON对象
  12. 如果REST API返回JSON,使用什么MIME类型?
0