0

我正在尝试使用我在同一个本地 tomcat 实例上的 web 服务向 ehCache 发送一个 HTTP PUT(为了创建一个新的缓存并用我生成的 JSON 填充它)。

我是 RESTful Web 服务的新手,正在使用 JDK 1.6、Tomcat 7、ehCache 和 JSON。

我的 POJO 定义如下:

人 POJO:

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class Person {
    private String firstName;
    private String lastName;
    private List<House> houses;

    // Getters & Setters
}

房子 POJO:

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class House {
    private String address;
    private String city;
    private String state;

    // Getters & Setters
}

使用 PersonUtil 类,我将 POJO 硬编码如下:

public class PersonUtil {
    public static Person getPerson() {
        Person person = new Person();
        person.setFirstName("John");
        person.setLastName("Doe");
        List<House> houses = new ArrayList<House>();
        House house = new House();
        house.setAddress("1234 Elm Street");
        house.setCity("Anytown");
        house.setState("Maine");
        houses.add(house);
        person.setHouses(houses);
        return person;
    }
}

能够为每个 GET 请求创建 JSON 响应:

@Path("")
public class MyWebService{

     @GET
     @Produces(MediaType.APPLICATION_JSON) 
     public Person getPerson() {
         return PersonUtil.getPerson();
     }
}

将war部署到tomcat并将浏览器指向时

http://localhost:8080/personservice/

生成的 JSON:

{ 
    "firstName" : "John", 
    "lastName" : "Doe",
    "houses": 
        [ 
            { 
              "address" : "1234 Elmstreet",
              "city"    : "Anytown",
              "state"   : "Maine"
            }
        ]
}

到目前为止,一切都很好,但是,我有一个不同的应用程序在同一个 tomcat 实例上运行(并且支持 REST):

http://localhost:8080/ehcache/rest/

在 tomcat 运行时,我可以发出这样的 PUT:

echo "Hello World" |  curl -S -T -  http://localhost:8080/ehcache/rest/hello/1

当我像这样“获取”它时:

 curl http://localhost:8080/ehcache/rest/hello/1

将产生:

你好世界

我需要做的是创建一个 POST 来放置我的整个 Person 生成的 JSON 并创建一个新的缓存:

  http://localhost:8080/ehcache/rest/person

当我对这个以前的 URL 执行“GET”时,它应该是这样的:

{ 
    "firstName" : "John", 
    "lastName" : "Doe",
    "houses": 
        [ 
            { 
              "address" : "1234 Elmstreet",
              "city"    : "Anytown",
              "state"   : "Maine"
            }
        ]
}

所以,到目前为止,这就是我的 PUT 的样子:

@PUT
@Path("/ehcache/rest/person")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON) 
public Response createCache() {
    ResponseBuilder response = Response.ok(PersonUtil.getPerson(), MediaType.APPLICATION_JSON);
    return response.build();
}

问题):

  1. 这是编写 PUT 的正确方法吗?
  2. 我应该在createCache()方法中写什么让它将我生成的 JSON 放入http://localhost:8080/ehcache/rest/person
  3. 使用 PUT 的命令行 CURL 注释会是什么样子?
4

2 回答 2

0

我希望 PUT 处理程序将 aPerson作为参数,以便它可以通过某种方式找出传递给它的内容。这就是 JAX-RS 的方式。我也希望不必返回一个Response给定的,我们只是用一个简单的值做一个 200 OK 响应。

@PUT
@Path("/ehcache/rest/person")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON) 
public Person createCache(Person who) {
    // Stuff in here to store the person, filling out with whatever
    // needs to be added...
    return who;
}

当然,一般来说,我还希望从路径中提取一个参数来指示正在更新的人,也许还有一个参数@Context UriInfo uriInfo来允许更详细地访问有关如何调用方法的信息(包括综合能力相关网址)。但那是巧夺天工。

于 2013-04-02T08:09:50.273 回答
0

如果您正在寻找使用 PUT 的有效方法,您可以参考我的博客文章,其中我也尝试提及 Post 和 Put 之间的区别 http://ykshinde.wordpress.com/2014/12/05/rest-put- vs-post/

它还有代码片段来返回适当的 HTTP 代码

希望它有帮助......

于 2014-12-09T16:45:19.237 回答