繁体   English   中英

在 JAX-RS 中使用位置标头创建响应

[英]Create Response with Location header in 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);

而这个肯定是行不通的。 在构建响应之前,我似乎需要获取当前的 HttpContext。

谢谢你的帮助。

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

来自响应 API

请记住您为created方法指定的location

新资源的 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 uriBuilder = uriInfo.getAbsolutePathBuilder();
        uriBuilder.path(Integer.toString(customerId));
        return Response.created(uriBuilder.build()).build();
    }
}

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

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

return Response.created(uriBuilder.build()).entity(newCustomer).build();
 @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();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM