Как мне прочитать параметры POST для сервиса RESTful, используя Джерси? - PullRequest
26 голосов
/ 23 мая 2011

Я не использую 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();
}

Ответы [ 4 ]

23 голосов
/ 23 мая 2011

К вашему сведению, вам нужно использовать @FormParam. Также убедитесь, что типы INPUT HTML используют имя = не идентификатор =.

19 голосов
/ 28 октября 2011

У меня такая же проблема.Использование аннотации @FormParam для отдельных параметров работает, но чтение их из HttpServletRequest, введенного через @Context, не работает.Я также пытался получить объект / параметры запроса через Guice, используя Provider<HttpServletRequest> и @RequestParameters<Map<String, String[]>>.В обоих случаях не было параметров записи.

Однако получить карту параметров можно, добавив параметр MultivaluedMap<String, String> в метод ресурса.Пример:

@POST
public void doSomething(MultivaluedMap<String, String> formParams) {
//...
}
5 голосов
/ 05 декабря 2013

Если вы используете Jersey RESTful API в JAVA, вы можете найти Аннотации параметров (@ * Param)

Пример:

Зависимость:

<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

2 голосов
/ 01 февраля 2013

В какой-то момент Jersey ContainerServlet (или другой объект Джерси во время обработки запроса) вызывает request.getInputStream () или request.getReader (), который устанавливает для «usingInputStream» или «usingReader» значение ИСТИНА. Это состояние предотвращает заполнение карты параметров внутри объекта запроса. Примерно так:

parseParameters() {
    if (usingInputStream || usingReader) {
        return; 
    } else {
        parametersMap.putAll({actual parameters parsing from stream})
    }
} 

Map getParametersMap() {
    return parametersMap;
}

Попробуйте поставить точку останова в самой первой точке входа (начало метода Джерси ServletContainer.service ()) вашего приложения и оцените вызов request.getParametersMap (). Вы получите ваши параметры.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...