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

2022-09-02 05:27:23

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

我遇到了这行(示例)代码,但用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。

感谢您的帮助。


答案 1

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

响应 API

请记住您为该方法指定的 :locationcreated

新资源的 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/1customerId

注意:如果要将实体与响应一起发送,则只需将实体(对象)附加到Response.ReponseBuilder

return Response.created(uriBuilder.build()).entity(newCustomer).build();

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

推荐