Ответ 1
FYI, вам нужно использовать @FormParam. Также убедитесь, что типы INPUT HTML используют name= not id =.
Я не использую JSON или что-то в этом роде. У меня есть простая форма для загрузки файла, и я хочу прочитать параметры формы. Код ниже работает не так, как ожидалось. Он не будет показывать никаких параметров.
@POST
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
@Path("{appNum}/{docId}/file")
public Response uploadDocFile(
@PathParam("appNum") String appNum,
@PathParam("docId") String docId,
@Context HttpServletRequest req)
{
try {
log.info("POST Parameters:");
Enumeration e = req.getParameterNames();
while(e.hasMoreElements())
{
Object key = e.nextElement();
log.info("Key: " + key);
log.info("Val: " + req.getParameter(key.toString()));
}
} catch (Exception e) {
e.printStackTrace();
return Response.status(Status.INTERNAL_SERVER_ERROR).entity(new StatusResponse(e)).build();
}
return Response.ok().build();
}
FYI, вам нужно использовать @FormParam. Также убедитесь, что типы INPUT HTML используют name= not id =.
У меня та же проблема. Использование аннотации @FormParam
для отдельных параметров работает, но чтение их из HttpServletRequest
, введенное через @Context
, не выполняется. Я также попытался получить объект/параметры запроса через Guice, используя Provider<HttpServletRequest>
и @RequestParameters<Map<String, String[]>>
. В обоих случаях не было параметров сообщений.
Тем не менее, можно получить карту параметров, добавив параметр MultivaluedMap<String, String>
в метод ресурса. Пример:
@POST
public void doSomething(MultivaluedMap<String, String> formParams) {
//...
}
Если вы используете Джерси RESTful API в JAVA, вы можете искать Аннотации параметров (@* Параметр)
Пример:
Зависимость:
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-client</artifactId>
<version>1.8</version>
</dependency>
код:
package yourpack;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.core.Response;
@Path("/path_to_data")
public class DataResource {
@GET
@Path("/{param}")
public Response getMsg(@PathParam("param") String urlparam) {
int ok = 200;
String result = "Jersey Data resource: " + urlparam;
return Response.status(ok).entity(result ).build();
}
}
Список аннотаций: @MatrixParam, @HeaderParam, @CookieParam, @FormParam, @QueryParam, @PathParam
В какой-то момент Jersey ContainerServlet (или другой объект Джерси во время обработки запроса) вызывает request.getInputStream() или request.getReader(), которые устанавливают 'usingInputStream' или 'usingReader' в TRUE. Это состояние предотвращает заполнение параметров карты внутри объекта запроса. Что-то вроде этого:
parseParameters() {
if (usingInputStream || usingReader) {
return;
} else {
parametersMap.putAll({actual parameters parsing from stream})
}
}
Map getParametersMap() {
return parametersMap;
}
Попробуйте поставить точку останова в самой первой точке входа (начало метода Jersey ServletContainer.service()) вашего приложения и оценить запрос request.getParametersMap(). Вы получите свои параметры.