[英]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
public static Response.ResponseBuilder created(URI location)
- 为创建的资源创建一个新的 ResponseBuilder,使用提供的值设置位置标头。
public abstract URI getLocation()
- 返回位置 URI,如果不存在则返回 null。
请记住您为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.