首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Amdatu多部分形式@FormParam总是空的。

Amdatu多部分形式@FormParam总是空的。
EN

Stack Overflow用户
提问于 2014-02-08 08:20:38
回答 2查看 2.7K关注 0票数 0

因此,我在Felix框架内使用Amdatu创建启用OSGi的JSON服务。

当我使用@GET时,我得到了预期的id值。

代码语言:javascript
复制
@GET
@Produces(MediaType.APPLICATION_JSON)
@Path("file")
public String getFile(@QueryParam("id") String id) {
    System.out.println("id : "+id);
    return null;
}

当我使用@POST时,FormParam总是空的

代码语言:javascript
复制
@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

代码语言:javascript
复制
@POST
@Consumes(MediaType.APPLICATION_JSON)
@Path("file")
public String getFile(String id) throws Exception { 
    return id
}

我正在使用高级rest客户端插件对chrome进行测试。

使用图书馆

代码语言:javascript
复制
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仍然没有。

在表单发布期间,我的标题是:

代码语言:javascript
复制
Content-Type: multipart/form-data

如果删除@FormParam,则id将填充如下:

代码语言:javascript
复制
id : --ARCFormBoundary5xbnwa6as8aor
Content-Disposition: form-data; name="id"

9
--ARCFormBoundary5xbnwa6as8aor--

当我添加@FormParam时,该值为null。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-02-13 20:14:09

JAX规范没有提到应该如何处理多部分/表单数据。不同的JAX实现有自己的专有方法来处理这个问题。据我所知,Apache (我们在此基础上构建的)不支持多部件的@FormParam。Wink中确实有一些支持多部件的类型:http://wink.apache.org/documentation/1.1.1/html/7.8%20MultiPart.html,但是这些类没有被Amdatu公开,而且我也从未尝试过使用这种类型。

下面是我自己使用的一个解决方法。当multipart用于与其他表单字段一起上载文件时,这是非常有用的(这就是为什么使用multipart的原因)。我使用解析请求,并访问上传的文件和表单字段。

代码语言:javascript
复制
@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();
    }
}
票数 4
EN

Stack Overflow用户

发布于 2014-02-08 10:07:55

看起来你使用了错误的媒介类型在@消耗品。

我创建了一个示例(参见下面),它接受表单中的一个参数,方法是完全省略@消耗品,或者将其设置为MediaType.APPLICATION_FORM_URLENCODED。

代码语言:javascript
复制
@POST
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
public void test(@FormParam("id") String id) {
    System.out.println(id);
}

HTML

代码语言:javascript
复制
<form action="/agenda" method="post">
<input type="id" name="id"/>
<input type="submit" value="Test">
</form>
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21643724

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档