Ami*_*rHd 42 java spring json curl html-post
在进入细节之前,我知道Stackoverflow上有很多对话和相关问题.所有这些都以不同的方式帮助我,所以我认为我把我的发现全部放在一起作为一个单独的有组织的常见问题解答来总结我的发现.
当然你知道这些,但我只是把它们写成快速回顾.如果我遗漏了什么,请随时编辑.
当您愿意将对象发送到Web服务或服务器端应用程序时,将使用发布请求.
是将对象从Web浏览器传递到服务器端应用程序的过程.可以使用jQuery Ajax调用或Curl post请求.
最流行的那些日子是JSON和XML.由于XML标记的性质,序列化的xml对象的大小相对较大,因此XML变得越来越不受欢迎.在本FAQ中,主要关注的是JSON2序列化.
Spring框架及其强大的注释使得以有效的方式公开Web服务成为可能.Spring中有很多不同的库.我们关注的是Spring web MVC.
这些是您可以用来在客户端发布帖子请求的工具.即使您计划使用JQuery ajax调用,我建议您使用Curl进行调试,因为它会在发出请求后为您提供详细的响应.
如果您的Web服务不依赖于Java EE模型,则必须使用@RequestBody.如果您正在使用模型并且您的JSON对象已添加到模型中,则可以通过@ModelAttribute访问该对象.仅在您的请求是GET请求或GET和POST请求组合的情况下,您将需要使用@RequestParam/@ PathVariable.
正如您从名称中看到的那样简单,如果您在服务器端方法处理请求后向客户端发送响应,则只需要@ResponseBody.
RequestMappingHandlerAdapter是Spring框架的新映射处理程序,它自Spring 3.1起取代了AnnotationMethodHandlerAdapter.如果您的现有配置仍在AnnotationMethodHandlerAdapter中,您可能会发现此帖子很有用.我的帖子中提供的配置将让您了解如何设置RequestMappingHandlerAdapter.
您需要设置一个消息转换器.这是您的序列化JSON消息体在服务器端转换为本地Java对象的方式.
基本配置从这里开始.转换器是MarshallingHttpMessageConverter和CastorMarshaller的基本配置示例,我已经用MappingJackson2HttpMessageConverter和MappingJacksonHttpMessageConverter替换它们.
我的项目设置方式,我有两个配置文件:
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的示例控制器.
这是公开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)
@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 -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)
如果并非所有提供以下帖子和问题的人都可以使用此常见问题解答(如果我遇到有用的相关帖子/问题,此列表将会扩展):
Ami*_*rHd 11
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匹配前面的示例.
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媒体类型.
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指南的更多详细信息.
如果并非所有提供以下帖子和问题的人都可以使用此常见问题解答(如果我遇到有用的相关帖子/问题,此列表将会扩展):
归档时间: |
|
查看次数: |
21708 次 |
最近记录: |