所以我在Felix框架中使用Amdatu来创建一个支持OSGi的JSON Rest服务。
当我使用@GET时,我会按预期获得id值
@GET
@Produces(MediaType.APPLICATION_JSON)
@Path("file")
public String getFile(@QueryParam("id") String id) {
System.out.println("id : "+id);
return null;
}
当我使用@POST FormParam时始终为null
@POST
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.MULTIPART_FORM_DATA)
@Path("file")
public String getFile(@FormParam("id") String id) {
System.out.println("id : "+id);
return null;
}
当我使用@POST但使用应用程序JSON时,我总是得到整个原始json,而不是值。
我关注了这段视频:http://www.amdatu.org/howto/createwebapp.html
@POST
@Consumes(MediaType.APPLICATION_JSON)
@Path("file")
public String getFile(String id) throws Exception {
return id
}
我正在使用chrome的高级rest客户端插件来测试服务。
使用库
org.amdatu.web.rest.jaxrs:1.0.4
org.amdatu.web.rest.wink:1.0.8
jackson-jaxrs:1.9.13
jackson-mapper-asl:1.9.13
jackson-core-asl:1.9.13
更新:
我将maven包中的依赖项设置为“已提供”,方法是将它们更改为“编译”MediaType.APPLICATION_FORM_URLENCODED现在可以正常工作。
但是MediaType.MULTIPART_FORM_DATA仍然没有。
在表单的帖子中,我的标题是:
Content-Type: multipart/form-data
如果我删除@FormParam,那么id将填充:
id : --ARCFormBoundary5xbnwa6as8aor
Content-Disposition: form-data; name="id"
9
--ARCFormBoundary5xbnwa6as8aor--
当我添加@FormParam时,该值为null。
答案 0 :(得分:4)
JAX-RS规范没有说明应该如何处理multipart / form-data。不同的JAX-RS实现有自己专有的方法来处理这个问题。据我所知,Apache Wink(我们构建在它之上)不支持@FormParam用于multipart。似乎Wink中有一些支持类型用于多部分:http://wink.apache.org/documentation/1.1.1/html/7.8%20MultiPart.html但Amdatu Wink包没有公开这些类,我也从未尝试过使用它。
我自己使用的解决方法是以下示例。当使用multipart与其他表单字段一起上传文件时,这很有用(这就是为什么主要使用multipart的原因)。我使用Apache File Upload来解析请求并访问上传的文件和表单字段。
@POST
@Consumes(MediaType.MULTIPART_FORM_DATA)
public void test(@Context HttpServletRequest request) {
ServletFileUpload uploader = new ServletFileUpload(new DiskFileItemFactory());
try {
List<FileItem> parseRequest = uploader.parseRequest(request);
for (FileItem fileItem : parseRequest) {
if (fileItem.isFormField()) {
System.out.println(fileItem.getFieldName() + ": "
+ fileItem.getString());
}
}
} catch (FileUploadException e) {
e.printStackTrace();
}
}
答案 1 :(得分:1)
看起来你在@Consumes中使用了错误的Mediatype。
我创建了一个示例(见下文),它接受表单中的参数,方法是完全省略@Consumes,或者将其设置为MediaType.APPLICATION_FORM_URLENCODED。
@POST
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
public void test(@FormParam("id") String id) {
System.out.println(id);
}
HTML
<form action="/agenda" method="post">
<input type="id" name="id"/>
<input type="submit" value="Test">
</form>