Spring 4.x/3.x(Web MVC)REST API和JSON2发布请求,如何一劳永逸地做到这一点?

Ami*_*rHd 42 java spring json curl html-post

在进入细节之前,我知道Stackoverflow上有很多对话和相关问题.所有这些都以不同的方式帮助我,所以我认为我把我的发现全部放在一起作为一个单独的有组织的常见问题解答来总结我的发现.

相关概念

当然你知道这些,但我只是把它们写成快速回顾.如果我遗漏了什么,请随时编辑.

HTTP POST请求:

当您愿意将对象发送到Web服务或服务器端应用程序时,将使用发布请求.

连载:

是将对象从Web浏览器传递到服务器端应用程序的过程.可以使用jQuery Ajax调用或Curl post请求.

序列化协议:

最流行的那些日子是JSON和XML.由于XML标记的性质,序列化的xml对象的大小相对较大,因此XML变得越来越不受欢迎.在本FAQ中,主要关注的是JSON2序列化.

弹簧:

Spring框架及其强大的注释使得以有效的方式公开Web服务成为可能.Spring中有很多不同的库.我们关注的是Spring web MVC.

Curl vs JQuery:

这些是您可以用来在客户端发布帖子请求的工具.即使您计划使用JQuery ajax调用,我建议您使用Curl进行调试,因为它会在发出请求后为您提供详细的响应.

@RequestBody vs @ RequestParam/@ PathVariable vs @ModelAttribute:

如果您的Web服务不依赖于Java EE模型,则必须使用@RequestBody.如果您正在使用模型并且您的JSON对象已添加到模型中,则可以通过@ModelAttribute访问该对象.仅在您的请求是GET请求或GET和POST请求组合的情况下,您将需要使用@RequestParam/@ PathVariable.

@RequestBody vs @ResposeBody:

正如您从名称中看到的那样简单,如果您在服务器端方法处理请求后向客户端发送响应,则只需要@ResponseBody.

RequestMappingHandlerAdapter vs AnnotationMethodHandlerAdapter:

RequestMappingHandlerAdapter是Spring框架的新映射处理程序,它自Spring 3.1起取代了AnnotationMethodHandlerAdapter.如果您的现有配置仍在AnnotationMethodHandlerAdapter中,您可能会发现此帖子很有用.我的帖子中提供的配置将让您了解如何设置RequestMappingHandlerAdapter.

建立

您需要设置一个消息转换器.这是您的序列化JSON消息体在服务器端转换为本地Java对象的方式.

基本配置从这里开始.转换器是MarshallingHttpMessageConverter和CastorMarshaller的基本配置示例,我已经用MappingJackson2HttpMessageConverter和MappingJacksonHttpMessageConverter替换它们.

在哪里放置配置

我的项目设置方式,我有两个配置文件:

  • 应用程序上下文XML:一个是您的sessionFactory bean,dataSource bean等所在的应用程序上下文XML文件.
  • 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>
Run Code Online (Sandbox Code Playgroud)

您可以拥有多个邮件转换器.在这里,我创建了一个普通的JSON以及一个JSON 2消息转换器.XML文件中的Ref和普通bean格式都已被使用(我个人更喜欢将ref标签作为整理器).

REST API

这是一个公开REST API的示例控制器.

控制器

这是公开HTTP发布请求的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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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()  + " | ";
    }

}
Run Code Online (Sandbox Code Playgroud)

CURL发布电话

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
Run Code Online (Sandbox Code Playgroud)

相关帖子和问题

如果并非所有提供以下帖子和问题的人都可以使用此常见问题解答(如果我遇到有用的相关帖子/问题,此列表将会扩展):

  1. 什么是正确的 JSON内容类型?
  2. Spring 3.0使用jackson消息转换器进行JSON响应
  3. 如何使用Curl从终端/命令行发布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从终端/命令行发布JSON数据到测试Spring REST?
  11. 如何从Java Servlet返回JSON对象
  12. 如果REST API返回JSON,那么MIME类型是什么?

Ami*_*rHd 11

CURL发布电话

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
Run Code Online (Sandbox Code Playgroud)

不同的错误场景:

在这里,我将探讨在您进行卷曲调用后可能遇到的不同错误以及可能出错的错误.

情景一:

HTTP/1.1 404 Not Found
Server: Apache-Coyote/1.1
Content-Type: text/html;charset=utf-8
Content-Length: 949
Date: Tue, 04 Jun 2013 02:59:35 GMT
Run Code Online (Sandbox Code Playgroud)

这意味着您提供的URL中不存在REST API.

根本原因:
  • 您的请求中可能有拼写错误(相信我会发生这种情况)!
  • 可能是你的弹簧配置不对.如果是这种情况,则需要进一步深入研究实际出现的问题,但在开始更复杂的调查之前,我已经提供了一些您需要做的初步操作.
操作:

在确保所有操作都完美正确并且您的配置和URL没有任何问题之后: - 运行maven clean. - 取消部署您的网络应用程序或只是删除它. - 重新部署Web应用程序 - 确保在maven/gradle中只使用一个版本的Spring

情景二:

HTTP/1.1 400 Bad Request
Server: Apache-Coyote/1.1
Content-Type: text/html;charset=utf-8
Content-Length: 968
Date: Tue, 04 Jun 2013 03:08:05 GMT
Connection: close
Run Code Online (Sandbox Code Playgroud)

这背后的唯一原因是您的请求格式不正确.如果您检查详细的卷曲响应,您应该能够看到"客户端发送的请求在语法上是不正确的.".

根本原因:

您的JSON格式不正确或者您缺少JAVA对象的必需参数.

操作:

确保以正确的格式和正确数量的参数提供JSON对象.Nullable属性不是必需的,但您必须为所有NotNullable属性提供数据.记住Spring使用Java反射将您的JSON文件转换为Java对象非常重要,这是什么意思?这意味着变量和方法名称是CasE SensItiVe.如果您的JSON文件正在发送变量"userName",那么您的Java对象中的匹配变量也必须命名为"userName".如果你有getter和setter,他们也必须遵循相同的规则.getUserName和setUserName匹配前面的示例.

Senario三:

HTTP/1.1 415 Unsupported Media Type
Server: Apache-Coyote/1.1
Content-Type: text/html;charset=utf-8
Content-Length: 1051
Date: Wed, 24 Aug 2011 08:50:17 GMT
Run Code Online (Sandbox Code Playgroud) 根本原因:

您的Web服务不支持Json媒体类型.这可能是由于您的注释没有指定媒体类型,或者您没有在Curl post命令中指定媒体类型.

操作:

检查您的消息转换器是否已正确设置,并确保Web服务注释与上面的示例匹配.如果这些都没问题,请确保在Curl post请求中指定content-type.

您的Web服务不支持json媒体类型.

Senario N(!):

HTTP/1.1 200 OK 
Server: Apache-Coyote/1.1 
Content-Type: application/json;charset=UTF-8 
Transfer-Encoding: chunked 
Date: Tue, 04 Jun 2013 03:06:16 GMT 
Run Code Online (Sandbox Code Playgroud)

恭喜用户实际发送到您的服务器端REST API.

有关如何设置弹簧结帐弹簧mvc指南的更多详细信息.

相关帖子和问题

如果并非所有提供以下帖子和问题的人都可以使用此常见问题解答(如果我遇到有用的相关帖子/问题,此列表将会扩展):

  1. 什么是正确的 JSON内容类型?
  2. Spring 3.0使用jackson消息转换器进行JSON响应
  3. 如何使用Curl从终端/命令行发布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从终端/命令行发布JSON数据到测试Spring REST?
  11. 如何从Java Servlet返回JSON对象
  12. 如果REST API返回JSON,那么MIME类型是什么?


归档时间:

查看次数:

21708 次

最近记录:

10 年,9 月 前