如何使用Jersey读取RESTful服务的POST参数?
我没有使用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(); }
仅供参考,您需要使用@FormParam。 还要确保INPUT HTML类型使用name = not id =。
我也有同样的问题。 对单个参数使用@FormParam
注释有效,但是从通过@Context
注入的HttpServletRequest
读取它们不起作用。 我还尝试使用Provider
和@RequestParameters
通过Guice获取请求对象/参数。 在这两种情况下都没有post参数。
但是,可以通过向resource方法添加MultivaluedMap
参数来获取参数映射。 例:
@POST public void doSomething(MultivaluedMap formParams) { //... }
如果您在JAVA中使用Jersey RESTful API ,则可以查找参数注释(@ * Param)
例:
相关性:
com.sun.jersey jersey-client 1.8
码:
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(或请求处理期间的其他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()调用。 你会得到你的参数。