Как получить параметры формы в фильтре запросов
m пытаюсь получить параметры формы запроса в фильтре запросов:
@Override
public ContainerRequest filter(final ContainerRequest request) {
final Form formParameters = request.getFormParameters();
//logic
return request;
}
Тем не менее, форма всегда кажется пустой.HttpRequestContext.getFormParameters()
Документация гласит:
Получить параметры формы объекта запроса.
Этот метод гарантирует, что объект запроса буферизуется так, что он может использоваться приложением.
Возвращает: параметры формы, если есть объект запроса и тип содержимого "применение / х-WWW-форм-urlencoded»в противном случае будет возвращен экземпляр, не содержащий параметров.
Мой ресурс аннотирован@Consumes("application/x-www-form-urlencoded")
хотя он победилне были сопоставлены до окончания фильтра запроса - вот почему это нет работает?
Я пытался сделать некоторые исследования, но не могНе могу найти никаких убедительных доказательств того, возможно ли это. Там былоэто 4-летняя дискуссияв которой Пол Сандос говорит:
Если вы работаете в фильтрах Джерси или сHttpRequestContext
Вы можете получить параметры формы следующим образом: [неработающая ссылка на Джерси 1.1.1]HttpRequestContext.getFormParameters
Я также нашелэто 3-летняя дискуссия о том, как получить поля формы multipart / form-data в фильтре запросов. В нем Пол Сандос использует следующий код:
// Buffer
InputStream in = request.getEntityInputStream();
if (in.getClass() != ByteArrayInputStream.class) {
// Buffer input
ByteArrayOutputStream baos = new ByteArrayOutputStream();
try {
ReaderWriter.writeTo(in, baos);
} catch (IOException ex) {
throw new ContainerException(ex);
}
in = new ByteArrayInputStream(baos.toByteArray());
request.setEntityInputStream(in);
}
// Read entity
FormDataMultiPart multiPart = request.getEntity(FormDataMultiPart.class);
Я пытался подражать этому подходу дляForm
вместо этого, но результатrequest.getEntityInputStream()
всегда пустой поток И глядя наисточникgetFormParameters
этот метод фактически делает то же самое:
@Override
public Form getFormParameters() {
if (MediaTypes.typeEquals(MediaType.APPLICATION_FORM_URLENCODED_TYPE, getMediaType())) {
InputStream in = getEntityInputStream();
if (in.getClass() != ByteArrayInputStream.class) {
// Buffer input
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
try {
ReaderWriter.writeTo(in, byteArrayOutputStream);
} catch (IOException e) {
throw new IllegalArgumentException(e);
}
in = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
setEntityInputStream(in);
}
ByteArrayInputStream byteArrayInputStream = (ByteArrayInputStream) in;
Form f = getEntity(Form.class);
byteArrayInputStream.reset();
return f;
} else {
return new Form();
}
}
Я могу'не могу понять, чтоs хлюпает поток ввода сущностей, прежде чем я доберусь до него. Что-то в Джерси должно потреблять это, потому что параметры формы позже передаются в метод ресурса. Что я здесь не так делаю, или это невозможно (и почему)?
РЕДАКТИРОВАТЬ: Вот'Пример отправки запроса:
POST /test/post-stuff HTTP/1.1
Host: local.my.application.com:8443
Cache-Control: no-cache
Content-Type: application/x-www-form-urlencoded
form_param_1=foo&form_param_2=bar
Вот's (несколько избыточно)регистрация запросов:
INFO: 1 * Server in-bound request
1 > POST https://local.my.application.com:8443/test/post-stuff
1 > host: local.my.application.com:8443
1 > connection: keep-alive
1 > content-length: 33
1 > cache-control: no-cache
1 > origin: chrome-extension://fdmmgilgnpjigdojojpjoooidkmcomcm
1 > user-agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.95 Safari/537.36
1 > content-type: application/x-www-form-urlencoded
1 > accept: */*
1 > accept-encoding: gzip,deflate,sdch
1 > accept-language: en-US,en;q=0.8
1 > cookie: [omitted]
1 >
Вот заголовки ответа на этот запрос, включаяСлед Джерси:
Content-Type →application/json;charset=UTF-8
Date →Fri, 09 Aug 2013 18:00:17 GMT
Location →https://local.my.application.com:8443/test/post-stuff/
Server →Apache-Coyote/1.1
Transfer-Encoding →chunked
X-Jersey-Trace-000 →accept root resource classes: "/post-stuff"
X-Jersey-Trace-001 →match path "/post-stuff" -> "/post\-stuff(/.*)?", [...], "(/.*)?"
X-Jersey-Trace-002 →accept right hand path java.util.regex.Matcher[pattern=/post\-stuff(/.*)? region=0,11 lastmatch=/post-stuff]: "/post-stuff" -> "/post-stuff" : ""
X-Jersey-Trace-003 →accept resource: "post-stuff" -> @Path("/post-stuff") com.application.my.jersey.resource.TestResource@7612e9d2
X-Jersey-Trace-004 →match path "" -> ""
X-Jersey-Trace-005 →accept resource methods: "post-stuff", POST -> com.application.my.jersey.resource.TestResource@7612e9d2
X-Jersey-Trace-006 →matched resource method: public javax.ws.rs.core.Response com.application.my.jersey.resource.TestResource.execute(java.lang.String,java.lang.String)
X-Jersey-Trace-007 →matched message body reader: class com.sun.jersey.api.representation.Form, "application/x-www-form-urlencoded" -> com.sun.jersey.core.impl.provider.entity.FormProvider@b98df1f
X-Jersey-Trace-008 →matched message body writer: java.lang.String@f62, "application/json" -> com.sun.jersey.core.impl.provider.entity.StringProvider@1c5ddffa
Вот (ничем не примечательный) конфиг сервлета:
jersey
com.sun.jersey.spi.container.servlet.ServletContainer
com.sun.jersey.config.property.packages
com.application.my.jersey
com.sun.jersey.spi.container.ResourceFilters
com.application.my.jersey.MyFilterFactory
com.sun.jersey.config.feature.Trace
true
1
Вот'Вот пример ресурса: я
@Path("/post-stuff")
@Produces(MediaType.APPLICATION_JSON)
public final class TestResource {
@POST
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
public Response execute(
@FormParam("form_param_1") final String formParam1,
@FormParam("form_param_2") final String formParam2
) {
return Response.created(URI.create("/")).entity("{}").build();
}
}
м с использованием Джерси 1.17.
Для тех, кто заинтересован, яя пытаюсь свернуть мой собственный обязательный параметр проверки, как описано вДЖЕРСИ-351, Мое решениеВот работал для параметров запроса, cookie и заголовка - параметры формы сохраняются на мне.