In this blog, I'll show you how to pass the content of a file to a RESTful web service and have it stored on the server it was received.
First write your CXF service and annotate it as follows:
@POST
@Path("saveFile")
@Produces({MediaType.APPLICATION_JSON})
@Consumes({MediaType.MULTIPART_FORM_DATA})
public UploadFile saveFile(MultipartBody body) {
List<Attachment> attachments = body.getAllAttachments();
Attachment att = attachments.get(0);
File destinationFile = new File("/tmp/log/fileX.txt");
try {
att.transferTo(destinationFile);
}
catch (IOException ioe) {
ioe.printStackTrace();
}
UploadFile savedFile = new UploadFile();
savedFile.setFilename("/tmp/log/fileX.txt");
return savedFile;
}
To call this service, I am using Apache httpcomponents package. Add the following dependencies to your pom.xml:
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.0-beta2</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpmime</artifactId>
<version>4.0-beta2</version>
</dependency>
And here is the test snippet to call the web service:
@Test
public void restSaveFile() {
String url = "http://localhost:8080/mywebapp/services/";
ResponseEntity<AuthenticationToken> authToken = restClient.authenticate(url + "authenticate");
String token = null;
if (authToken != null)
token = authToken.getBody().getToken();
try {
HttpClient httpclient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost(url + "saveFile");
// Assuming ~mywebapp/src/test/resource/data/test-file.txt
FileBody body = new FileBody(new File(Thread.currentThread().getContextClassLoader().getResource("data/test-file.txt").getFile()));
StringBody comment = new StringBody("Test data for saving a file.");
httpPost.addHeader("X-Auth-Token", token);
httpPost.addHeader("Content-Type", MediaType.MULTIPART_FORM_DATA_VALUE);
MultipartEntity requestEntity = new MultipartEntity();
requestEntity.addPart("file", body);
requestEntity.addPart("comment", comment);
httpPost.setEntity(requestEntity);
System.out.println("Executing request " + httpPost.getRequestLine());
HttpResponse response = httpclient.execute(httpPost);
HttpEntity responseEntity = response.getEntity();
System.out.println("----------------------------------------------");
System.out.println(response.getStatusLine());
if (responseEntity != null) {
System.out.println("Response content length: " + responseEntity.getContentLength());
System.out.println("Response content type: " + responseEntity.getContentType().getValue());
}
if (responseEntity != null) {
responseEntity.consumeContent();
}
System.out.println("----------------------------------------------");
}
catch (Exception ex) {
ex.printStackTrace();
}
}
No comments:
Post a Comment