Как получить доступ к параметрам POST в HttpServletRequest?


У меня есть приложение, которое в основном является прокси-сервером для службы. Само приложение построено на Джерси и обслуживается Jetty. У меня есть этот метод ресурсов:

@POST
@Path("/{default: .*}")
@Timed
@Consumes("application/x-www-form-urlencoded")
public MyView post(@Context UriInfo uriInfo, @Context HttpServletRequest request) {
  ...
}

Пользователь отправляет форму POST. Все почтовые запросы проходят через этот метод. UriInfo и HttpServletRequest вводятся соответствующим образом, за исключением одной детали: кажется, нет никаких параметров. Вот мой запрос, отправленный с терминала:

POST /some/endpoint HTTP/1.1
Accept: */*
Accept-Encoding: gzip, deflate
Connection: keep-alive
Content-Length: 15
Content-Type: application/x-www-form-urlencoded; charset=utf-8
Host: localhost:8010
User-Agent: HTTPie/0.9.2

foo=bar&biz=baz

Здесь тело сообщения явно содержит 2 параметра: foo и biz. Но когда я пытаюсь чтобы получить их в моем коде (request.getParameterMap), результатом является карта размера 0.

Как получить доступ к этим параметрам или этой строке параметров из моего метода ресурсов? Если это имеет значение, то реализация HttpServletRequest, которая используется, является org.затмение.пристань.сервер.Запрос.

1 2

1 ответ:

Три варианта

  1. @FormParam("<param-name>") к отдельным парам gt. Экс.

    @POST
    @Consumes("application/x-www-form-urlencoded")
    public Response post(@FormParam("foo") String foo
                         @FormParam("bar") String bar) {}
    
  2. Используйте a MultivaluedMap, чтобы получить все параметры

    @POST
    @Consumes("application/x-www-form-urlencoded")
    public Response post(MultivaluedMap<String, String> formParams) {
        String foo = formParams.getFirst("foo");
    }
    
  3. Используйте Form, чтобы получить все параметры.

    @POST
    @Consumes("application/x-www-form-urlencoded")
    public Response post(Form form) {
        MultivaluedMap<String, String> formParams = form.asMap();
        String foo = formParams.getFirst("foo");
    }
    
  4. Используйте @BeanParam вместе с отдельными @FormParams, чтобы получить все отдельные парамы внутри боба.

    public class FormBean {
        @FormParam("foo")
        private String foo;
        @FormParam("bar")
        private String bar;
        // getters and setters
    }
    
    @POST
    @Consumes("application/x-www-form-urlencoded")
    public Response post(@BeanParam FormBean form) {
    }