【问题标题】:return newly generated id restful service post返回新生成的id restful service post
【发布时间】:2012-10-19 09:27:23
【问题描述】:

我正在尝试在我的 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());
}

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

我做了一些研究,发现了this 的问题。所以我的猜测不是返回一个字符串,我应该返回一个 201 已创建状态的响应对象并调整标题或什么?我查看了 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();
}

【问题讨论】:

  • 您不需要调整任何标题。 Response.created() 自动将您提供给 http 响应的 URI 作为“位置”标头。所以看起来你已经有了解决方案。
  • 嗨 Pavel,我只在javax.ws.rs.core.Response 中找到以下方法​public static Response.ResponseBuilder created(URI location)。为创建的资源创建一个新的 ResponseBuilder,使用提供的值设置位置标头。

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


【解决方案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"

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

【讨论】:

  • 嗨皮特,已经感谢您的回答。我会尽快试试这个。使用“客户端生成的 xml 数据”,我实际上提到了发送到 Web 服务(使用它)的 XML 字符串
  • 我同时测试了它,但仍然得到相同的 HTTP Status 415 - Unsupported Media Type 错误。说明:服务器拒绝了这个请求,因为请求实体的格式不被请求的方法所请求的资源支持(不支持的媒体类型)。
  • Hm.. 您发送的 xml 错误或您的服务无法处理该特定格式.. 无法帮助您,因为我们使用的是 JSON,我可以通过发送一个轻松测试curl 在我的命令行中请求。我将在我的帖子中添加我为测试所做的事情。不知道这是否也适用于 xml,因此您可以选择测试。可能是 netBeans 搞砸了电话,不知道..
  • 嗯我怀疑 XML 是问题,因为用户实际上是被添加的?如果 XML 中有错误,我认为不会添加用户...
  • 好的,返回 id 现在可以与您提供给 Pete 的代码一起使用。我可以在客户端上成功检索 ID,但是由于某种奇怪的原因,我在通过浏览器测试该方法时不断收到 415 错误...无论如何,非常感谢!
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 2019-06-22
    • 2015-02-12
    • 1970-01-01
    • 2016-05-11
    • 2023-03-30
    • 2011-11-18
    • 2020-11-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多