28

我正在努力实现以下目标。

从请求中读取自定义标头及其值:

name: username

现在,在响应时,我想name:value在 HTTP 响应中返回相同的标头对。

我正在使用 JAX-RS webservice 的 Jersey 2.0 实现。

当我发送请求 URLHttp://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;
}

我怎样才能做到这一点?任何指针都会很棒!

4

4 回答 4

57

我认为使用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;
    }
于 2014-01-20T09:11:43.700 回答
38

只需注入 a@Context HttpServletResponse response作为方法参数。更改标题

@Produces(MediaType.APPLICATION_JSON)
public UserClass getValues(@Context HttpHeaders header, @Context HttpServletResponse response) {
    response.setHeader("yourheadername", "yourheadervalue");
    ...
}
于 2013-07-26T13:55:49.507 回答
2

返回一个Response(来自 JAX-RS 的类)UserClass作为实体。您可以在Response上面设置 HTTP 标头。

于 2013-07-26T13:55:32.863 回答
0

我发现 HttpServletResponse 方法不起作用。相反,我们安装了一个自定义响应过滤器:

@Provider
public class MyFilter implements ContainerResponseFilter {
    @Override
    public void filter(ContainerRequestContext requestContext, ContainerResponseContext ctx) throws IOException {
        ArrayList<Object> valueList = new ArrayList<>();
        valueList.add("my-header-value");
        ctx.getHeaders().put("My-header", valueList);
        ...
    }
}

和网络应用程序:

public class MyApp extends Application {
    static Set<Object> singletons = new LinkedHashSet<>();
    public static void setSingletons(Set<Object> singletons) {
        MyApp.singletons = singletons;
    }
    @Override
    public Set<Object> getSingletons() {
        return singletons;
    }
}

Set<Object> singletons = new LinkedHashSet<>();
singletons.add(new MyFilter());
MyApp.setSingletons(singletons);
于 2022-03-02T16:22:55.887 回答