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

Suj*_* PS 3 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);
Run Code Online (Sandbox Code Playgroud)

但我收到一个错误:

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

这有什么解决方案吗?

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

Pau*_*tha 5

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

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


您可以看到每个部分都有边界.我们不必担心手动设置它.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));
Run Code Online (Sandbox Code Playgroud)

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

<dependency>
   <groupId>org.jboss.resteasy</groupId>
   <artifactId>resteasy-multipart-provider</artifactId>
   <version>${resteasy.version}</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

而且只是为了完整......

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

@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();
    }
}
Run Code Online (Sandbox Code Playgroud)