Подтвердить что ты не робот

Как узнать параметры POST для службы RESTful с помощью Jersey?

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

Ответ 1

FYI, вам нужно использовать @FormParam. Также убедитесь, что типы INPUT HTML используют name= not id =.

Ответ 2

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

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

@POST
public void doSomething(MultivaluedMap<String, String> formParams) {
//...
}

Ответ 3

Если вы используете Джерси 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

Ответ 4

В какой-то момент 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(). Вы получите свои параметры.