如何使用Jersey读取RESTful服务的POST参数?

时间:2011-05-23 12:27:21

标签: java rest 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();
}

4 个答案:

答案 0 :(得分:23)

仅供参考,您需要使用@FormParam。还要确保INPUT HTML类型使用name = not id =。

答案 1 :(得分:19)

我有同样的问题。对单个参数使用@FormParam注释有效,但从HttpServletRequest注入的@Context中读取它们不会。我还尝试使用Provider<HttpServletRequest>@RequestParameters<Map<String, String[]>>通过Guice获取请求对象/参数。在这两种情况下都没有帖子参数。

但是,可以通过向资源方法添加MultivaluedMap<String, String>参数来获取参数映射。例如:

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

答案 2 :(得分:5)

如果您在JAVA中使用Jersey RESTful API,则可以查找Parameter Annotations (@*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

答案 3 :(得分:2)

在某些时候,Jersey ContainerServlet(或请求处理期间的其他Jersey对象)调用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()调用。你会得到你的参数。