Асинхронные вызовы REST с JAX-RS - PullRequest
3 голосов
/ 22 июня 2011

Мне нужно создать службу RESTful, которая должна поддерживать асинхронные вызовы следующим образом.Когда пользователь вызывает какой-либо метод, он получает http-код «202» и URL-адрес для опроса, где он может видеть состояние своего запроса.В настоящее время я использую JAX-RS и его аннотации:

@Path("")
public interface MyService {

    @POST
    @Path("/myService/{name}")
    @Consumes({APPLICATION_XML, APPLICATION_JSON})
    void postSomething(@PathParam("name") String name, MyObject data);

}

Такое отображение предоставит MyService метод postSomething () с помощью url / myService / {name}, который обслуживает запросы POST, получит параметр 'name' из url и 'data 'from body request.

Я хочу, чтобы после выполнения этого запроса PUT клиент получал 202 http-кода и некоторый URL-адрес обратного вызова для опроса, чтобы получить результат после выполнения метода.

Итак, вопрос: 1. Как заставить JAX-RS возвращать код 202?2. Как передать URL обратного вызова клиенту?

Ответы [ 2 ]

2 голосов
/ 22 июня 2011

Пусть метод postSomething возвращает объект Response:

public Response postSomething(@PathParam("name") String name, MyObject data) {
   return Response.status(Status.ACCEPTED).build();
}

Если вы хотите, чтобы URI обратного вызова был в виде простого текста в теле HTTP, вы могли бы сделать что-то вроде этого:

public Response postSomething(@PathParam("name") String name, MyObject data) {
   return Response.status(Status.ACCEPTED).entity("http://google.com").build();
}

Для генерации URI по классам ресурсов, посмотрите на UriBuilder

0 голосов
/ 22 июня 2011

Используйте @Context HttpServletResponse servletResponse, чтобы получить прямой контроль над механизмом ответа сервлета.

@PUT
@Path("/myService/{name}")
@Consumes({APPLICATION_XML, APPLICATION_JSON})
void postSomething(@PathParam("name") String name, @Context HttpServletResponse response, MyObject data) {
    // ...
    response.setStatus(HttpServletResponse.SC_ACCEPTED);
    response.setHeader("Location", myURL);
    // ...
}
...