Пользовательский заголовок ответа Джерси /Java

Я пытаюсь добиться следующего.

Прочитайте пользовательский заголовок и его значение из запроса:

name: username

Теперь, в ответ, я хотел бы вернуть тот же заголовок name:value пара в ответе HTTP.

Я использую Jersey 2.0 для реализации веб-сервиса JAX-RS.

Когда я отправляю запрос 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;
}

Как я могу достичь этого? Любые указатели были бы великолепны!

4 ответа

Решение

Просто введите @Context HttpServletResponse response в качестве аргумента метода. Изменить заголовки на этом

@Produces(MediaType.APPLICATION_JSON)
public UserClass getValues(@Context HttpHeaders header, @Context HttpServletResponse response) {
    response.setHeader("yourheadername", "yourheadervalue");
    ...
}

Я думаю, используя 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;
    }

Вернуть Response (класс от JAX-RS) с UserClass как сущность. На Response Вы можете установить заголовки HTTP.

Я обнаружил, что подход 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);
Другие вопросы по тегам