如何在REST中创建POST请求以接受JSON输入?

我正在尝试学习REST风格的Web服务。 并且我正在创建一组简单的Web服务。 当我开始开发POST时陷入了困境。

我想将JSON输入传递给POST方法。 这就是我在代码中所做的:

@RequestMapping(value = "/create", method = RequestMethod.POST, consumes="application/x-www-form-urlencoded", produces="text/plain")
@ResponseStatus(HttpStatus.CREATED)
public @ResponseBody String createChangeRequest(MyCls mycls) {
    return "YAHOOOO!!"; 
}

我在我的POM.xml中包含了Jackson。

 <dependency>
    <groupId>org.codehaus.jackson</groupId>
    <artifactId>jackson-mapper-lgpl</artifactId>
    <version>1.9.13</version>
</dependency>   

MyCls是一个简单的类,有几个getter和setter。

我从chrome的简单REST客户端调用上述POST服务。

URL: http://localhost:8080/MYWS/cls/create
Data: {<valid-json which corresponds to each variable in the MyCls pojo}

我看到下面的回应:

415 Unsupported Media Type
The server refused this request because the request entity is in a format not supported by the requested resource for the requested method.

我尝试在REST客户端的POST请求中添加头文件作为“application / json” - 但这没有帮助。

有人能让我知道我在这里错过了什么吗? 我如何自动将我的输入JSON映射到MyCls pojo? 我在这里是否缺少任何配置?

编辑:MyCls.java

public class MyCls{
   private String name;
   private String email;
   private String address;
       public String getName() {
    return name;
   }
   public void setName(String name) {
    name= name;
   }
       ---similar getter and setter for email, address--
}

来自Chrome的json简单REST客户端:

{"name":"abc", "email":"de@test","address":"my address"}

编辑:改变我的控制器方法到以下,但仍然看到相同的错误:

@RequestMapping(value = "/create", method = RequestMethod.POST, consumes="application/json", produces="text/plain")
@ResponseStatus(HttpStatus.CREATED)
 public @ResponseBody String createChangeRequest(@RequestBody MyCls mycls) {
  return "YAHOOOO!!"; 
 }

假设你的客户端发送application/json作为其内容类型,然后映射到一个处理程序

consumes="application/x-www-form-urlencoded"

将无法处理它。 实际的Content-type与预期不符。

如果你期待application/json ,你应该有

consumes="application/json"

另外,声明

public @ResponseBody String createChangeRequest(MyCls mycls) {

是(在默认环境下)等同于

public @ResponseBody String createChangeRequest(@ModelAttribute MyCls mycls) {

这意味着MyCls对象是从请求参数创建的,而不是来自JSON主体。 相反,你应该有

public @ResponseBody String createChangeRequest(@RequestBody MyCls mycls) {

以便Spring将您的JSON反序列MyCls类型的对象。

链接地址: http://www.djcxy.com/p/48517.html

上一篇: How to create a POST request in REST to accept a JSON input?

下一篇: Android Socket + ObjectOutputStream not working correctly