JAX RS将文件POST到服务器

时间:2017-07-26 15:30:54

标签: java jax-rs

我有一个JAX-RS服务器实现,它使用以下Bean对象传递请求数据,让我们称之为具有以下参数的DisputeComment

public class DisputeComment {

    private String id;
    private String dispute;
    private String user;
    private String admin;
    private String comment;
    private String date;
}

这是我在JAX-RS

中定义HTTP发布请求的方式
@POST
    @Path("/disputes/{id}/comments")
    @Consumes({ "multipart/mixed;type=application/json;charset=UTF-8" /* , MediaType.APPLICATION_XML */})
    @Produces({ "multipart/mixed;type=application/json;charset=UTF-8" /* , MediaType.APPLICATION_XML */ })
    GetCommentsResponse addComment(
            @PathParam("id")
            @Pattern(regexp = "[0-9]+", message = "The id must be a valid number")
            @NotNull
                    String disputeId, DisputeCommentRequest request) throws TechnicalWsFault;

到目前为止,这项工作确实很顺利。

但是现在,我想调整此HTTP请求以便能够传递文本文件。我尝试了一些事情,但它似乎没有用,这是我尝试过的。我添加了一个额外的参数InputStream并更改了Consumes注释。

public class DisputeComment {

        private String id;
        private String dispute;
        private String user;
        private String admin;
        private String comment;
        private String date;
        private InputStream inputStream;

    }
@Consumes({"multipart/mixed;type=application/json;charset=UTF-8"})

这应该有效吗?我甚至不知道如何测试这个?如果有人可以告诉我应该在代码中更改哪些内容以便接受文件和json对象的其余部分,那将会很棒? 我如何编写客户端测试代码。 这是我的代码,它正在测试没有上传文件功能的HTTP帖子

WebClient wc = getClient();
        DisputeCommentRequest disputeCommentRequest = new DisputeCommentRequest();
        disputeCommentRequest.setUser(MockData.GMID);
        disputeCommentRequest.setComment(MockData.DISPUTE_COMMENT);
        Response res = wc.path("disputes/" + MockData.DISPUTE_ID + "/comments").accept("multipart/mixed;type=application/json;charset=UTF-8").type("multipart/mixed;type=application/json;charset=UTF-8").post(disputeCommentRequest);
        res.bufferEntity();

2 个答案:

答案 0 :(得分:0)

我在我的一个项目中遇到了完全相同的问题。 我原本应该发照片。经过几个小时尝试处理multipart,我发现了一个简单的解决方案(可以满足您的需求,因为我知道您只想发送一个文本文件)。 您可以在base64中对文件进行编码,并将其作为帖子请求中的字段发送。然后你在你的后端解码它。

{
    id:"",
    dispute:"",
    user:"",
    admin:"",
    comment:"",
    date:"",
    fileBase64:""
}

有关Google正在其视觉API中使用此功能的信息。

祝你好运

答案 1 :(得分:0)

您可以自行阅读POST数据。我无法告诉您如何发送数据,但您可以使用HttpServletRequest.getReader()。如果您要发送的只是文件,那么您只需读取文件并将其存储为字符串,或者如果文件很长,则将其写入文件。如果您还要发送其他信息,那将涉及您的一些解析。