在JAX-RS中使用Location头创建响应

时间:2014-09-29 03:56:06

标签: java c# jax-rs

我在NetBeans中使用RESTful模板在实体中自动生成类,具有CRUD函数(使用POST,GET,PUT,DELETE注释)。我有 create 方法的问题,在从前端插入实体后,我希望 create 更新响应,以便我的视图将自动(或异步,如果这是正确的术语)反映了增加的实体。

我遇到了这个(示例)代码行,但用C#编写(我对此一无所知):

HttpContext.Current.Response.AddHeader("Location", "api/tasks" +value.Id);

在Java中使用JAX-RS,无论如何都可以像在C#中那样获取当前的HttpContext并操纵头文件?

我最接近的是

Response.ok(entity).header("Location", "api/tasks" + value.Id);

这个肯定不起作用。在构建Response之前,我似乎需要获取当前的HttpContext。

感谢您的帮助。

2 个答案:

答案 0 :(得分:38)

我认为你的意思是做Response.created(createdURI).build()之类的事情。这将创建一个201 Created状态的响应,其中createdUri是位置标头值。通常这是通过POST完成的。在客户端,您可以调用将返回新URI的Response.getLocation()

来自Response API

请注意您为location方法指定的created

  

新资源的URI。如果提供了相对URI,则通过相对于请求URI解析它,将其转换为绝对URI。

如果您不想依赖静态资源路径,则可以从UriInfo类获取当前的uri路径。你可以做点什么

@Path("/customers")
public class CustomerResource {
    @POST
    @Consumes(MediaType.APPLICATION_XML)
    public Response createCustomer(Customer customer, @Context UriInfo uriInfo) {
        int customerId = // create customer and get the resource id
        UriBuilder builder = uriInfo.getAbsolutePathBuilder();
        builder.path(Integer.toString(customerId));
        return Response.created(builder.build()).build();
    }
}

这将创建位置.../customers/1(或customerId的任何内容),并将其作为响应标头发送

请注意,如果您要将实体与响应一起发送,则只需将entity(Object)附加到Response.ReponseBuilder

的方法链即可

答案 1 :(得分:-1)

 @POST
public Response addMessage(Message message, @Context UriInfo uriInfo) throws URISyntaxException
{
    System.out.println(uriInfo.getAbsolutePath());

    Message newmessage = messageService.addMessage(message);

    String newid = String.valueOf(newmessage.getId()); //To get the id

    URI uri = uriInfo.getAbsolutePathBuilder().path(newid).build();

    return Response.created(uri).entity(newmessage).build();
}