2011-05-23 78 views
26

我没有使用JSON或类似的东西。我有一个简单的表单上传文件,我想读取表单的参数。下面的代码不能按预期工作。它不会显示任何参数。如何使用Jersey读取REST式服务的POST参数?

@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(); 
} 
+0

形式是一个普通的HTML表单,我知道这个代码是正确的: – 2011-05-23 12:28:54

+1

提交的PARAMS(用萤火虫检查) – Bozho 2011-05-23 12:30:32

+0

是的,我用wireshark验证 – 2011-05-23 12:39:37

回答

23

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

+0

我在我的机器上重现了这个问题。你应该仍然可以访问HttpServletRequest(按照http://jersey.java.net/nonav/documentation/latest/user-guide.html#d4e522),我不知道为什么我无法。我尝试了多个servlet容器,所以如果有人知道为什么会发生这种情况,我会很好奇。 – stand 2011-05-24 00:34:15

+0

因为我在谷歌搜索时登陆这里。我发现这个工作'公共响应doSomething(@Context HttpContext上下文)'。然后您可以使用'context'的参数来获取请求。 – sunn0 2015-10-29 20:49:48

19

我有同样的问题。使用@FormParam作为个别参数的注释工作,但从HttpServletRequest通过@Context注入它们不会。我还试图通过Guice使用Provider<HttpServletRequest>@RequestParameters<Map<String, String[]>>来获取请求对象/参数。在这两种情况下都没有后期参数。

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

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

在(请求处理过程中或其他泽西对象)的时间泽西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; 
} 

尝试把一个破发点在第一个入口点你的应用程序(泽西ServletContainer.service()方法的开始),并评估request.getParametersMap()调用。你会得到你的参数。

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

相关问题