Пользовательский заголовок ответа Джерси /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);