我有一个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();
答案 0 :(得分:0)
我在我的一个项目中遇到了完全相同的问题。 我原本应该发照片。经过几个小时尝试处理multipart,我发现了一个简单的解决方案(可以满足您的需求,因为我知道您只想发送一个文本文件)。 您可以在base64中对文件进行编码,并将其作为帖子请求中的字段发送。然后你在你的后端解码它。
{
id:"",
dispute:"",
user:"",
admin:"",
comment:"",
date:"",
fileBase64:""
}
有关Google正在其视觉API中使用此功能的信息。
祝你好运答案 1 :(得分:0)
您可以自行阅读POST数据。我无法告诉您如何发送数据,但您可以使用HttpServletRequest.getReader()。如果您要发送的只是文件,那么您只需读取文件并将其存储为字符串,或者如果文件很长,则将其写入文件。如果您还要发送其他信息,那将涉及您的一些解析。