返回新生成的id restful service post

时间:2012-10-19 09:27:23

标签: java web-services rest jersey jax-rs

我正在尝试在我的REST Web服务中编辑我的create方法,因此它应该从对象返回新创建的ID。我过去两天一直在努力,但我必须做一些非常错误的事情......

这是服务器端编辑的create方法:

@POST
@Consumes({"application/xml", "application/json"})
@Path("withID")
@Produces("text/plain")
public String create2(Users entity) {
    getEntityManager().persist(entity);
    getEntityManager().flush();
    System.out.println("new id: " + entity.getId());
    return String.valueOf(entity.getId());
}

它基于(通过netbeans)生成的count()方法,如下所示:

@GET
@Path("count")
@Produces("text/plain")
public String countREST() {
    return String.valueOf(super.count());
}

如果我从我的客户端请求添加新的Users对象,它的工作方式与预期的一样。新用户正在添加到数据库中。在GlassFish服务器日志中,我看到System.out.println命令显示的新创建的ID。但是,如果我通过netbeans中的TestRestful Web服务进行测试,将客户端生成的XML代码粘贴到正确的窗口并点击TEST按钮,我会收到 HTTP状态415 - 不支持的媒体类型错误。

我做了一些研究,发现了this个问题。所以我的猜测而不是返回一个String,我应该返回一个具有201 CREATED状态的Response对象并调整标题或其他东西?我查看了春天的例子,但由于我没有使用spring,我不知道如何调整create2方法代码...但是我试了一下但是我错过了一些部分:

@POST
@Consumes({"application/xml", "application/json"})
@Path("withID")
@Produces("text/plain") //should this change to application/xml?
public Response create2(Users entity) {
    getEntityManager().persist(entity);
    getEntityManager().flush();
    System.out.println("new id: " + entity.getId());

    //Response response = Response.created(... + "withID/" + entity.getId()); //response need an URI, can I get this through the entity object?

    return Response.status(200).entity(entity.getId().toString()).build();    
}

我希望我走在正确的轨道上。对不起,很长的帖子,希望有人可以帮助我。提前谢谢!

编辑:现在的工作示例:

@POST
@Consumes({"application/xml"})
@Path("withID")
@Produces({"application/xml"})
public Response create2(Users entity) {
    getEntityManager().persist(entity);
    getEntityManager().flush();
    return Response.status(201).entity(entity.getId().toString()).build();
}

2 个答案:

答案 0 :(得分:1)

我不知道NetBeans的东西,我们正在使用Spring ..但是返回一个Response对象是一个好主意,我们总是这样做,我们也返回一个创建的ID:

return Response.status(200).entity(createdObject.getId().toString()).build();

不支持的MediaType非常烦人。当你提到客户端生成的xml数据时,不确定你在谈论什么。我们正在使用JSON,即使响应只是一个简单的字符串,我们告诉create方法生成JSON:

@POST
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
@Transactional
public Response create(T source) {
}

我们在命令行上使用的简单测试:

$ curl -v -H "Accept: application/json" -H "Content-type: application/json" -X POST -d '{"id":95, "additional":"stuff..."}' "http://localhost:8080/rest/resource"
好吧,祝你好运。看起来你走在正确的轨道上。

答案 1 :(得分:0)

只需使用协议,而不是返回一些自定义blob。

因此,请考虑使用uri对新资源的响应中的位置标头。你正在做一个休息服务,所以你的ID当然是URI(对吧?)。

Jim Webber写了一本关于设计REST实践的REST Web服务的好书,它详细解释了如何基于这样的简单原则设计REST apis。