自定义响应头 Jersey/Java
Posted
技术标签:
【中文标题】自定义响应头 Jersey/Java【英文标题】:Custom response header Jersey/Java 【发布时间】:2013-07-26 19:56:51 【问题描述】:我正在努力实现以下目标。
从 Request 中读取自定义标头及其值:
name: username
现在,在响应时,我想在 HTTP 响应中返回相同的标头 name:value
对。
我正在使用 JAX-RS 网络服务的 Jersey 2.0 实现。
当我发送请求 URL Http://localhost/test/
时,请求标头也被传递(暂时,虽然 Firefox 插件 - 硬编码它们)。
收到对该 URL 的请求后,将调用以下方法:
@GET
@Produces(MediaType.APPLICATION_JSON)
public UserClass getValues(@Context HttpHeaders header)
MultivaluedMap<String, String> headerParams = header.getRequestHeaders();
String userKey = "name";
headerParams.get(userKey);
// ...
return user_object;
我怎样才能做到这一点?任何指针都会很棒!
【问题讨论】:
【参考方案1】:返回 Response
(来自 JAX-RS 的类),以 UserClass
作为实体。在Response
上,您可以设置 HTTP 标头。
【讨论】:
对不起,我不关注。你能详细说明一下吗?【参考方案2】:只需注入 @Context HttpServletResponse response
作为方法参数。更改标题
@Produces(MediaType.APPLICATION_JSON)
public UserClass getValues(@Context HttpHeaders header, @Context HttpServletResponse response)
response.setHeader("yourheadername", "yourheadervalue");
...
【讨论】:
是否需要我添加其他库?它说不明类“HttpServletResponse”。 @Namenoobie 您需要服务器运行时库。这基本上是 servlet api。如果您在 Eclipse 上,请转到您的项目 java buildpath 并添加库。 当我按照说明操作时,我得到了本地机器上已经存在的 Tomcat 服务器。 使用它设置标题对我有用,但使用它设置状态代码不起作用(使用 Dropwizard)。相反,我使用了 Alex P 的答案并使用了 Response。使其更具可读性(和可测试性)。 我正在使用 Maven 构建系统,我应该在 pom.xml 中包含什么依赖项才能获得 HttpServletResponse?【参考方案3】:我认为使用javax.ws.rs.core.Response
更优雅,它是泽西岛的一部分。只是为了扩展之前的答案,这里是一个简单的例子:
@GET
@Produces( MediaType.APPLICATION_JSON )
@Path("/values")
public Response getValues(String body)
//Prepare your entity
Response response = Response.status(200).
entity(yourEntity).
header("yourHeaderName", "yourHeaderValue").build();
return response;
【讨论】:
这应该是选择的答案。 更简单地将.status(200).entity
替换为.ok
。
这可能会导致使用 swagger codegen 自动生成 API 文档时出现问题。
对于文档生成,您可以使用annotations 指示响应类型。见@ApiOperation
这绝对应该是选择的答案以上是关于自定义响应头 Jersey/Java的主要内容,如果未能解决你的问题,请参考以下文章