我需要将文件附加到我的服务端点。 我通过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客户端代码来附加文件吗?
答案 0 :(得分: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));
这假设您具有所需的依赖关系,因为如果服务器正在接受多部分,我将进行映像
<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();
}
}