我没有使用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();
}
答案 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()调用。你会得到你的参数。