用于附加文件的RESTeasy客户端代码

我需要将一个文件附加到我的服务端点。 我通过POSTMAN(chrome浏览器插件测试rest服务)测试了function,它运行正常。

但是我需要用JUNIT来测试它。 对于这种情况,我使用的是RESTeasy客户端。

我正在尝试使用此代码:

StringBuilder sb = new StringBuilder(); BufferedReader br = new BufferedReader(new FileReader("C:/Temp/tempfile.txt")); try { String line = br.readLine(); while (line != null) { sb.append(line); sb.append(System.lineSeparator()); line = br.readLine(); } } finally { br.close(); } byte[] file = sb.toString().getBytes(); Client client = ClientBuilder.newClient(); Invocation.Builder builder = client.target(webTarget.getUri() + "/attachment" ).request(MediaType.MULTIPART_FORM_DATA_TYPE); Response response = builder.post(Entity.entity(file, MediaType.MULTIPART_FORM_DATA), Response.class); 

但我收到一个错误:

org.apache.commons.fileupload.FileUploadException:请求被拒绝,因为没有找到多部分边界

这有什么解决方案吗?

或者任何人都可以提供示例RESTeasy rest客户端代码来附加文件?

Multipart具有特殊格式。 如果服务器需要多部分/表单数据格式,我们不能将其作为普通请求发送。 您可以查看Postman中的预览窗口以查看格式

在此处输入图像描述在此处输入图像描述


你可以看到每个部分都有一个边界。 我们不必担心手动设置它。 Resteasy有一个用于构建多forms输出的API。 您可以使用MultipartFormDataOutput类来构建输出。 只需使用addFormData方法添加部件即可。 在您的情况下,它只有一个部分,但请求仍将按服务器预期的方式进行格式化。

所以你的要求看起来应该更像

 MultipartFormDataOutput output = new MultipartFormDataOutput(); // file (below) doesn't have to be a `byte[]` // It can be a `File` object and work just the same output.addFormData("file", file, MediaType.APPLICATION_OCTET_STREAM_TYPE); Response response = target.request() .post(Entity.entity(output, MediaType.MULTIPART_FORM_DATA)); 

这假设您具有所需的依赖关系,因为如果服务器正在接受多部分,我将进行映像

  org.jboss.resteasy resteasy-multipart-provider ${resteasy.version}  

  • 查看有关使用multipart / form-data输出的更多信息

而且只是为了完整……

对于任何对服务器端感兴趣的未来读者(因为您没有提供代码),这就是我以前测试的内容

 @Path("/multipart") public class MultipartResource { @POST @Consumes(MediaType.MULTIPART_FORM_DATA) public Response postData(MultipartFormDataInput input) throws Exception { byte[] bytes = input.getFormDataPart("file", byte[].class, null); JOptionPane.showMessageDialog(null, new JLabel(new ImageIcon(bytes))); return Response.ok("GOT IT").build(); } }