HttpServletRequest getParameterMap - извлекает только параметры формы - PullRequest
0 голосов
/ 20 января 2020

getParameterMap() HttpServletRequest возвращает как параметры запроса, так и данные опубликованной формы.

Я могу получить параметры запроса отдельно от UriInfo.getQueryParameters().

Но мне нужны параметры формы отдельно как MultivaluedMap, похожий на параметры запроса, есть ли способ получить его?

РЕДАКТИРОВАНИЕ:

Я прошу прощения за то, что не разъяснил это. Я пытаюсь получить параметры формы в фильтре / перехватчике.

1 Ответ

0 голосов
/ 20 января 2020

Вы можете поместить MultivaluedMap в качестве параметра в методе ресурса. Это будет тело запроса. JAX-RS поместит все параметры в карту для вас.

@POST
@Consumes("application/x-www-form-urlencoded")
public Response post(@Context UriInfo uriInfo, MultivaluedMap params) {}

ОБНОВЛЕНИЕ (к отредактированному сообщению)

Так что если вы хотите получить параметры в фильтре, вы можете получить тело от ContainerRequestContext. С Джерси вместо InputStream с context.getEntityStream() вы можете привести ContainerRequestContext к реализации Джерси ContainerRequest. Это даст вам доступ к методам bufferEntity() и readEntity(). Эти методы позволят вам легко получить параметры формы. Вам нужно будет буферизовать сущность, чтобы ее можно было прочитать позже, когда ее нужно будет передать в ваш метод ресурсов.

@Provider
public class MyFilter implements ContainerRequestFilter {

    @Override
    public void filter(ContainerRequestContext context) throws IOException {
        if (MediaTypes.typeEqual(MediaType.APPLICATION_FORM_URLENCODED_TYPE, context.getMediaType())) { {
            return;
        }
        ContainerRequest request = (ContainerRequest) context;
        request.bufferEntity();
        Form form = request.readEntity(Form.class);
        MultivaluedMap params<String, String> = form.asMap();
        MultivaluedMap<String, String> query = context.getUriInfo().getQueryParameters();
    }
}

Если вы хотите использовать фильтр только с указанными c методами ресурсов , тогда вы можете использовать Привязка имени или Dynami c Привязка .

Если по какой-то причине readEntity() возвращает пустую карту (я видел редко появления людей, имеющих эту проблему), вы можете попытаться получить Form через внутреннее свойство

Object formProperty = request.getProperty(InternalServerProperties.FORM_DECODED_PROPERTY);
if (formProperty != null) {
    Form for = (Form) formProperty;
}
...