【问题标题】:How do I read POST parameters for a RESTful service using Jersey?如何使用 Jersey 读取 RESTful 服务的 POST 参数?
【发布时间】:2011-05-23 12:27:20
【问题描述】:

我没有使用 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();
}

【问题讨论】:

  • 表单是普通的HTML表单,我知道这段代码是正确的:
  • 是提交的参数(用萤火虫检查)
  • 是的,我用wireshark验证过

标签: java rest jersey


【解决方案1】:

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

【讨论】:

  • 我在我的机器上重现了这个问题。您应该仍然可以访问 HttpServletRequest (根据 jersey.java.net/nonav/documentation/latest/… ),我不知道为什么我不能。我已经尝试过多个 servlet 容器,所以如果有人知道为什么会发生这种情况,我会很好奇。
  • 自从我在谷歌搜索时登陆这里。我发现这可以工作public Response doSomething(@Context HttpContext context)。然后您可以使用来自context 的参数获取请求。
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

    如果你在 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

    【讨论】:

      【解决方案4】:

      在某个时间点,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() 调用。你会得到你的参数。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-08-22
        • 2011-09-30
        • 2011-02-17
        • 1970-01-01
        • 1970-01-01
        • 2015-03-11
        • 1970-01-01
        相关资源
        最近更新 更多