In this post I'm going to tell how to export a file or Serialzable java object in the server using a REST api call.
From the client's perspective he is downloading a file.
If you want to enable downloading a file in the server you can do it in the following way.
This example send an object type of MLModel as a stream.
[1] http://examples.javacodegeeks.com/enterprise-java/rest/jax-rs-download-file/
[2] http://stackoverflow.com/questions/10100936/file-downloading-in-restfull-web-services
[3] http://howtodoinjava.com/2013/05/10/resteasy-file-download-example/
[4] http://rest.elkstein.org/2008/02/using-rest-in-java.html
[5] http://java.dzone.com/articles/streaming-apis-json-vs-xml-and
[6] http://stackoverflow.com/questions/29640523/streaming-the-result-of-rest-api-from-twitter
[7] http://stackoverflow.com/questions/3496209/input-and-output-binary-streams-using-jersey
[8] http://stackoverflow.com/questions/23421967/jax-rs-send-serialized-objects
[9] https://developer.jboss.org/thread/174955
[10] http://www.ibm.com/developerworks/library/j-5things1/
[11] http://www.postseek.com/meta/8ee7d7c8a67ab5f555f0403d19d27dd9 -
From the client's perspective he is downloading a file.
If you want to enable downloading a file in the server you can do it in the following way.
@GET
@Path("/{modelName}")
@Produces(MediaType.APPLICATION_OCTET_STREAM)
public Response exportFile(@PathParam("modelName") String modelName) {
try {
MLModelNew model = mlModelHandler.getModel(tenantId, userName, modelName);
if(model != null) {
String filePath = model.getStorageDirectory();
File file = new File(filePath);
return Response.ok(file).build();
} else {
return Response.status(Response.Status.NOT_FOUND).build();
}
} catch (MLModelHandlerException e) {
logger.error(String.format(
"Error while retrieving model [name] %s. Cause: %s",
modelName, e.getMessage()));
return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(e.getMessage()).build();
}
}
There's another useful scenario of downloading a java serializable object as it is. This can be done by sending it as a stream. Here is how you can send a java object as a stream.This example send an object type of MLModel as a stream.
@GET
@Path("/{modelName}")
@Produces(MediaType.APPLICATION_OCTET_STREAM)
public Response exportModel(@PathParam("modelName") String modelName) {
try {
MLModelNew model = mlModelHandler.getModel(tenantId, userName, modelName);
if(model != null) {
final MLModel generateModel = mlModelHandler.retrieveModel(model.getId());
StreamingOutput stream = new StreamingOutput() {
public void write(OutputStream outputStream) throws IOException {
ObjectOutputStream out = new ObjectOutputStream(outputStream);
out.writeObject(generateModel);
}
};
return Response.ok(stream).build();
} else {
return Response.status(Response.Status.NOT_FOUND).build();
}
} catch (Exception e) {
logger.error(String.format(
"Error while retrieving model [name] %s. Cause: %s",
modelName, e.getMessage()));
return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(e.getMessage()).build();
}
}
References :[1] http://examples.javacodegeeks.com/enterprise-java/rest/jax-rs-download-file/
[2] http://stackoverflow.com/questions/10100936/file-downloading-in-restfull-web-services
[3] http://howtodoinjava.com/2013/05/10/resteasy-file-download-example/
[4] http://rest.elkstein.org/2008/02/using-rest-in-java.html
[5] http://java.dzone.com/articles/streaming-apis-json-vs-xml-and
[6] http://stackoverflow.com/questions/29640523/streaming-the-result-of-rest-api-from-twitter
[7] http://stackoverflow.com/questions/3496209/input-and-output-binary-streams-using-jersey
[8] http://stackoverflow.com/questions/23421967/jax-rs-send-serialized-objects
[9] https://developer.jboss.org/thread/174955
[10] http://www.ibm.com/developerworks/library/j-5things1/
[11] http://www.postseek.com/meta/8ee7d7c8a67ab5f555f0403d19d27dd9 -
No comments:
Post a Comment