【问题标题】:Amdatu multi-part-form @FormParam is always nullAmdatu 多部分形式 @FormParam 始终为空
【发布时间】:2023-03-11 01:12:01
【问题描述】:

所以我在 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 时总是为空

@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 的那一刻,该值为空。

【问题讨论】:

  • 您要发送多部分请求吗?对于普通形式,情况并非如此,因此由资源获取参数是正确的。
  • 我的标题是:Content-Type: multipart/form-data

标签: java rest osgi multipartform-data amdatu


【解决方案1】:

JAX-RS 规范没有说明应该如何处理 multipart/form-data。不同的 JAX-RS 实现有自己的专有方法来处理这个问题。据我所知,Apache Wink(我们在其之上构建)不支持 @FormParam 进行多部分。 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();
    }
}

【讨论】:

    【解决方案2】:

    您似乎在 @Consumes 中使用了错误的媒体类型。

    我创建了一个示例(见下文),它通过完全省略 @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>
    

    【讨论】:

    • 仍然返回 null。将库添加到描述中。还需要什么吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多