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

时间:2014-12-23 13:22:25

标签: java rest junit jax-rs resteasy

我需要将文件附加到我的服务端点。 我通过POSTMAN测试了这个功能(chrome浏览器插件来测试休息服务),它运行正常。

但是我需要用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客户端代码来附加文件吗?

1 个答案:

答案 0 :(得分:5)

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

enter image description here enter image description here


您可以看到每个部分都有边界。我们不必担心手动设置。 Resteasy有一个用于构建多形式输出的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));

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

<dependency>
   <groupId>org.jboss.resteasy</groupId>
   <artifactId>resteasy-multipart-provider</artifactId>
   <version>${resteasy.version}</version>
</dependency>


只是为了完整......

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

@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();
    }
}