3

我正在尝试在我的 REST Web 服务中编辑我的 create 方法,以便它应该从对象返回新创建的 ID。过去两天我一直在尝试,但我一定是做错了什么……

这是服务器端编辑后的创建方法:

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

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

我做了一些研究,发现了这个问题。所以我猜我应该返回一个 201 CREATED 状态的响应对象,而不是返回一个字符串,并调整标题或什么?我查看了 spring 示例,但由于我没有使用 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();
}
4

2 回答 2

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"

好吧,祝你好运。看起来你在正确的轨道上。

于 2012-10-19T09:45:54.100 回答
0

无需返回一些自定义 blob,只需使用协议即可。

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

Jim Webber 写了一本很棒的关于设计 REST Web 服务的书,叫做 REST in Practice,它非常详细地解释了如何基于这样的简单原则设计 REST API。

于 2012-10-19T16:20:39.833 回答